※ 「[C#][.NET] メタプログラミング入門 - 応用編 - オブジェクトの文字列変換を静的/動的に行う」の続き。
前回は、メタプログラミングによらない静的な方法とリフレクションによる動的な方法で、オブジェクトを文字列に変換した。
今回から、メタプログラミングによる動的コード生成を試していきたい。
■ 静的な方法とリフレクションによる動的な方法の問題点
メタプログラミングによる動的コード生成を試す前に、前回試した2つの方法の問題点を再確認しておこう。
静的な方法の問題点
前回は、Book クラスをデバッグ用文字列、XML、HTML に変換する静的なプログラミングの例をあげた。
対象とする型ごとに手でコードを書かなければならない、というのが問題点だった。
リフレクションによる動的な方法の問題点
前回は、ジェネリック プログラミングとリフレクションによって対象とするオブジェクトの型への依存を無くすことで、汎用的なプログラムを書くことができた。
だが、リフレクションは、動的に型情報を取得して利用する為に、実行速度が遅いという問題があった。
■ メタプログラミングによる動的コード生成による方法
そこで考えられるアプローチが、メタプログラミングだ。
つまり、静的なプログラミングの「対象とする型ごとに手でコードを書かなければならない」の「手で」の部分を、プログラムで生成してしまえば良いのではないか、ということだ。 「対象とする型ごとにプログラムでコードを生成し、それを用いる」のだ。
コード生成自体は、対象とするオブジェクトの型に依存せずに行う。ジェネリック プログラミングとリフレクションも用いることになるだろう。
しかし、一旦生成してしまえば、それを実行するのは静的なコードと変わらない。
「[C#][.NET] メタプログラミング入門 - Add メソッドのパフォーマンスの比較」で調べたように、文字列変換の度にコード生成していたのでは、とても時間が掛かってしまう。「[C#][.NET] メタプログラミング入門 - メソッド呼び出しのパフォーマンスの比較」で行ったように、キャッシュを用いる必要があるだろう。生成したコードを対象の型毎にキャッシュにしまうことにしよう。
次回から、これまで行った3つの動的コード生成の方法で、オブジェクトの文字列への変換をやっていく。また、実行時のパフォーマンスに関しても調べることにしたい。
- [C#][.NET] メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプログラミング (Reflection.Emit 編)
- [C#][.NET] メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプログラミング (式木編)
- [C#][.NET] メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプログラミング (Roslyn 編)
- [C#][.NET] メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプログラミング (パフォーマンスのテスト)