リフレクションの使用でパフォーマンスの問題が発生しています。
そこで、オブジェクトのプロパティのデリゲートを作成することにしました。これまでのところ、次のようになりました。
TestClass cwp = new TestClass();
var propertyInt = typeof(TestClass).GetProperties().Single(obj => obj.Name == "AnyValue");
var access = BuildGetAccessor(propertyInt.GetGetMethod());
var result = access(cwp);
static Func<object, object> BuildGetAccessor(MethodInfo method)
{
var obj = Expression.Parameter(typeof(object), "o");
Expression<Func<object, object>> expr =
Expression.Lambda<Func<object, object>>(
Expression.Convert(
Expression.Call(
Expression.Convert(obj, method.DeclaringType),
method),
typeof(object)),
obj);
return expr.Compile();
}
結果は非常に満足のいくもので、従来の方法を使用するよりも約 30 ~ 40 倍高速でした ( PropertyInfo.GetValue (obj, null);
)
問題は、同じように機能するプロパティをどのように作成できるかということです。SetValue
残念ながら、方法がありませんでした。
<T>
アプリケーションの構造上、メソッドを使用できないため、そうしています。