あなたはリフレクションのオーバーヘッドを避けることを目指していますが、式ツリーを扱っているので、プロパティを設定するために式をコンパイルしようとしています。
すべてのプロパティは、舞台裏で単純にgetおよびsetメソッドです。これらを呼び出すことができます - これはExpression.Call
を使って.NET 3.5表現木で行うことができます。例えば:あなたが望むすべてが値を設定するためのデリゲートであれば、あなたもまったく式ツリーを使用せずに、デリゲートを作成することができます
class Test{ public int X {get;set;} }
//...elsewhere
var xPropSetter = typeof(Test)
.GetProperty("X",BindingFlags.Instance|BindingFlags.Public)
.GetSetMethod();
var newValPar=Expression.Parameter(typeof(int));
var objectPar=Expression.Parameter(typeof(Test));
var callExpr=Expression.Call(objectPar, xPropSetter, newValPar);
var setterAction = (Action<Test,int>)
Expression.Lambda(callExpr, objectPar, newValPar).Compile();
Test val = new Test();
Console.WriteLine(val.X);//0
setterLambda(val,42);
Console.WriteLine(val.X);//42
注:
var setterAction = (Action<Test,int>)
Delegate.CreateDelegate(typeof(Action<Test,int>), xPropSetter);
あなたはの例を与えることができます達成しようとしていることは何ですか? –