2010-12-30 6 views
3

.Net 4.0では、MicrosoftはExpression.Assignを追加しました。私は3.5を使用して立ち往生しています。私は、オブジェクトのプロパティを設定することができるメソッドを書くためのいくつかの手段を考案しようとしていますが、これまではあまり運がありませんでした。私はこれを行うことができます:.Net 3.5のExpression.Assignに相当しますか?

public void Assign(object instance, PropertyInfo pi, object value) 
{ 
    pi.SetValue(instance, value, null); 
} 

しかし、私は反射を使用するオーバーヘッドを避けたい!プロパティはrefで使用できません。これは可能ですか?

+0

あなたはの例を与えることができます達成しようとしていることは何ですか? –

答えて

8

あなたはリフレクションのオーバーヘッドを避けることを目指していますが、式ツリーを扱っているので、プロパティを設定するために式をコンパイルしようとしています。

すべてのプロパティは、舞台裏で単純に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); 
+1

この回答は実際に私の心を吹き飛ばします。 – Amy

+0

:-Dお手伝いします! –

+0

'Lambda'の' ref'または 'out'パラメータに値を代入する必要があるときに、' Expression.Assign'を置き換える方法は分かりますか?私はこれを行う方法を見つけることができませんでした。 –

関連する問題