18

PropertyInfoプロパティを取得および設定するメソッドが非常に遅いのはなぜですか? を使用してデリゲートを構築するReflection.Emitと、はるかに高速になります。

かかる時間を正当化できるように、彼らは何か重要なことを行っていますか? つまり... PropertyInfo のandを使用Reflection.Emitする代わりにデリゲートを作成するために使用することで何かが足りないのですか (開発速度は別として)?GetValueSetValue

PS: 推測だけでなく、根拠を示してください!

4

2 に答える 2

15

Emit を使用する必要はありません。Expression を使用する方がはるかに簡単です。SOで説明されているように、アクセスを高速化できます 。ヘルパー クラスは、getter または setter への「メソッド ポインタ」(Action/Func) を作成します。Action/Func を再利用すると、通常のセッターと同じくらい速く実行できます。

   // creating setter (once)
   var propertyInfo = typeof(T).GetProperty(field);
   var setter = FastInvoke.BuildUntypedSetter<T>(propertyInfo));

   // usage somehow later in a loop of data
   foreach(var myobject in MySource)
   {
     setter(myobject, myValue)
   }
于 2013-06-29T11:56:07.523 に答える