特定の種類のオブジェクト マッパーを作成しています。DataTable
基本的には、 fields を持つa
aから、 propertiesb
をc
持つ objectに変換したいと思います(オブジェクトのクラスは手で書かれます)。多くの異なる DataTable とそれらがマップされる必要がある多くの異なるクラスがあるため、このデータのコピーを実行する汎用メカニズムを作成したいと考えています。基本的には、次の機能が必要です。a
b
c
public T Map<T>(DataTable t) where T: new() { ... }
今、これを Reflection で行うことができますが、それは遅いです。この関数はフレームワークの中核となり、頻繁に使用されます。そこで、動的コード生成について考えています。このメソッドが特定で初めて実行されるT
と、必要なリフレクションが実行され、すべての適切なマッピングを行う匿名メソッドが発行されます。次回はそのコードを実行するだけです。これは、可能な限りパフォーマンスを向上させる必要があります。
1 つだけ問題があります。実行時にコードを発行したことがありません。それ、どうやったら出来るの?を見ましたExpressions
が、一連のステートメントではなく、式しか実行できません。
次に CodeDOM とCSharpCodeProvider
. そのような作業 - C# コードを文字列として生成し、オンザフライでコンパイルしてから参照を取得できます。ただし、これには C# コンパイラが関与し、まったく新しいインメモリ アセンブリが生成されます。少し聞こえる... 1 つの単純な方法としては重量級です。
もっと簡単な方法はありますか?どのアセンブリにもアタッチされていない (または既存のアセンブリにアタッチされている) 軽量の匿名メソッドを生成するものはありますか?
OK、人々が例を求めたので。
これが手書きのクラスです
class MyBusinessObject
{
public int a;
public string b { get; set; }
}
手動で準備された DataTable を次に示します (実際には、これは外部ライブラリから取得されます)。
DataTable t = new DataTable();
t.AddColumn("a", typeof(int));
t.AddColumn("b", typeof(string));
t.AddRow(42, "Meaning");
オンザフライで生成する必要があるメソッドは次のとおりです。
(DataRow drow, MyBusinessObject o) =>
{
o.a = (int)drow["a"];
o.b = (string)drow["b"];
}
簡潔にするために必要なものをいくつか省略しましたが、それが問題の核心です。