私は、オブジェクトのプロパティの値を取得するために代理人を作成して再利用する必要があることを読んだ。Delegate.DynamicInvokeが遅すぎる、呼び出しを呼び出す方法を変更するには?
私は今、私は唯一の「DynamicInvoke」のコールでデリゲートを使用する方法を見つけるの委任
var objParm = Expression.Parameter(property.DeclaringType, "o");
Type delegateType = typeof(Func<,>).MakeGenericType(property.DeclaringType, property.PropertyType);
var lambda = Expression.Lambda(delegateType, Expression.Property(objParm, property.Name), objParm);
return lambda.Compile()
を作成するには、このコードを使用します。
私はパフォーマンスの理由の原因を「呼び出し」に変更したいと思います。
私は
Delegate.Method.Invoke(invokedObject, null);
を試してみましたが、私は例外
MethodInfo must be a RuntimeMethodInfo.
を得る呼び出しの後、私は私が動的に作成デリゲートを保存することができ、各プロパティのキャッシュクラスを持っています。
私は "normal" Invokesを使用することができますか?
ありがとうございます。
「私は私がオブジェクトのプロパティの値を取得するためにデリゲートを作成し、再利用する必要があることを読みました。」非常にまれなケースでは、これは正しかった、「非常に」はここの術語である。ほとんどの場合、あなたは 'x.Property'だけですべきです。 – jason
はい、まったく正しいです、説明の間違いでした。リフレクション(GetValue、SetValue)との一貫性を意味していました。 – Khh
ここで問題となるのは、実行時にプロパティの名前が変わるだけでなく、型も変わるということです。これにより、高速の型セーフなデリゲート呼び出しの代わりに、スローリフレクションベースの呼び出しを使用する必要があります。 –