리플렉션의 오버 헤드를 피하기 위해 표현 트리를 다루려고하기 때문에 속성을 설정하기 위해 표현식을 컴파일하려고한다고 가정합니다.
모든 속성은 백그라운드에서 간단히 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);
당신의 예를 들어 줄 수 당신이 성취하고자하는 것은 무엇입니까? –