2010-12-30 1 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

'람다'의'ref' 또는'out' 매개 변수에 값을 할당해야 할 상황 인'Expression.Assign'을 대체 할 방법이 있는지 알고 있습니까? 나는 이것을 할 길을 찾을 수 없었다. –