3

リフレクションを使用してオブジェクトのプロパティを設定する非常に古いコードがあります。たとえば、次のようなものです。

var properties = obj.GetType().GetProperties(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
foreach (var property in properties)
{
  property.SetValue(obj, lookup[property.Name]);
}

そのコードを置き換えて高速化することを考えていました。しかし、上記のコードではオブジェクトのプライベート プロパティを設定することもできるため、他にどのようなオプションがあるかわかりません。

質問:

  1. コンパイルされた式 (System.Linq.Expressions を使用) と生成されたコード (CodeDom / Microsoft.CSharp.CSharpCodeProvider を使用) を使用してプライベート プロパティを設定することはできませんか?
  2. Reflection.Emit を使用してそれは可能でしょうか?
  3. マッピング ライブラリ ( AutoMapperValueInjecter ) のいずれかがこれに役立ちますか (内部で使用しているテクノロジはわかりません)。
  4. 他のオプションはありますか?
4

1 に答える 1

1

オープン ソース フレームワークのImpromptu-InterfaceInvokeSetには、リフレクションではなく DLR を使用する静的メソッドがあり、プライベート メソッドを呼び出します。これは、あなたのものに似ているユニットスピードテストケースのリフレクションよりも 2 倍強速く実行されます。

using ImpromptuInterface;

...

foreach(var property in properties){
    ImpromptuInterface.InvokeSet(obj, property.Name, lookup[property.Name]);
}
于 2011-03-08T01:24:15.953 に答える