[C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング
※ 「[C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換を静的/動的に行う」の続き。
前回は、メタプログラミングによらない静的な方法とリフレクションによる動的な方法で、オブジェクトを文字列に変換した。
今回から、メタプログラミングによる動的コード生成を試していきたい。
■ 静的な方法とリフレクションによる動的な方法の問題点
メタプログラミングによる動的コード生成を試す前に、前回試した2つの方法の問題点を再確認しておこう。
静的な方法の問題点
前回は、Book クラスをデバッグ用文字列、XML、HTML に変換する静的なプログラミングの例をあげた。
対象とする型ごとに手でコードを書かなければならない、というのが問題点だった。
リフレクションによる動的な方法の問題点
前回は、ジェネリック プログラミングとリフレクションによって対象とするオブジェクトの型への依存を無くすことで、汎用的なプログラムを書くことができた。
だが、リフレクションは、動的に型情報を取得して利用する為に、実行速度が遅いという問題があった。
■ メタプログラミングによる動的コード生成による方法
そこで考えられるアプローチが、メタプログラミングだ。
つまり、静的なプログラミングの「対象とする型ごとに手でコードを書かなければならない」の「手で」の部分を、プログラムで生成してしまえば良いのではないか、ということだ。
「対象とする型ごとにプログラムでコードを生成し、それを用いる」のだ。
コード生成自体は、対象とするオブジェクトの型に依存せずに行う。ジェネリック プログラミングとリフレクションも用いることになるだろう。
しかし、一旦生成してしまえば、それを実行するのは静的なコードと変わらない。
「[C#][.NET] メタプログラミング入門 – Add メソッドのパフォーマンスの比較」で調べたように、文字列変換の度にコード生成していたのでは、とても時間が掛かってしまう。「[C#][.NET] メタプログラミング入門 – メソッド呼び出しのパフォーマンスの比較」で行ったように、キャッシュを用いる必要があるだろう。生成したコードを対象の型毎にキャッシュにしまうことにしよう。
次回から、これまで行った3つの動的コード生成の方法で、オブジェクトの文字列への変換をやっていく。また、実行時のパフォーマンスに関しても調べることにしたい。
- [C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (Reflection.Emit 編)
- [C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (式木編)
- [C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (Roslyn 編)
- [C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (パフォーマンスのテスト)
関連
関連記事
.NET Tips: NDoc の紹介
■ NDoc の紹介 Visual Studio 2005 と "ND ...
.NET Core 3.0 正式版リリース
.NET Core 3.0 正式版リリース 昨日 (2019/09/23)、.N ...
[C#][.NET][Roslyn] Build 2014 でオープンソースになったと発表された Roslyn のソースコードを弄ってみた
Build 2014 での Roslyn 関連の発表 先日、マイクロソフトの開発 ...
[C#][.NET] メタプログラミング入門 – 応用編 – オブジェクトの文字列変換のメタプログラミング (パフォーマンスのテスト)
※ 「 メタプログラミング入門 - 応用編 - オブジェクトの文字列変換のメタプ ...
C# Tips: interface を 抽象クラス (abstract class) とどう使い分けるか
# 久々に技術ネタを書いてみる。 # と言っても、某掲示板で使ったネタの使い回し ...
ディスカッション
コメント一覧
まだ、コメントがありません