2017-09-22 20 views
0

Expression을 사용하여 이미 갖고있는 개체 인스턴스의 속성을 어떻게 설정할 수 있습니까? 새 객체를 만들고 싶지 않기 때문에 멤버 이니셜 라이저를 전달할 수있는 Expression.New이 작동하지 않습니다.기존 개체 인스턴스의 속성을 설정하는 식

How to set property value using Expressions?의 복사본은 Expression이며 Reflection을 통해 속성을 설정하기 때문에 중복되지 않습니다.

기존 object이 있고 속성을 설정할 수있는 Expression을 만들고 싶습니다. 그 표현은 delegate으로 컴파일되어 실행됩니다.

+0

[표현식을 사용하여 속성 값을 설정하는 방법] (https://stackoverflow.com/questions/9601707/how-to-set-property-value-using-expressions) –

+2

Expression.Assign으로 표현식을 복제 할 수 있습니다. 할당하려는 속성의 PropertyInfo를 전달하는 개체의 속성 (사용자가 사용하는 방법에 따라 ConstantExpression 또는 ParameterExpression으로) – pinkfloydx33

답변

1

:

public class User { 
    public string Name {get;set;} 
} 

public static void Main() 
{ 
    var user = new User(); 
    var assigner = GetAssigner<User, string>(u => u.Name); 
    assigner.Compile()(user, "Joe"); 
    Console.WriteLine(user.Name); 
} 

public static Expression<Action<TClass, TValue>> GetAssigner<TClass, TValue>(Expression<Func<TClass, TValue>> propertyAccessor){ 
    var prop = ((MemberExpression)propertyAccessor.Body).Member; 
    var typeParam = Expression.Parameter(typeof(TClass)); 
    var valueParam = Expression.Parameter(typeof(TValue)); 
    return Expression.Lambda<Action<TClass, TValue>>(
     Expression.Assign(
      Expression.MakeMemberAccess(typeParam, prop), 
      valueParam), typeParam, valueParam); 

} 

는 표현이 수행되어야 하는지를 단지 정의는 것을 기억하십시오, 당신은 그것을 호출 할 수있는 대리자로 컴파일해야합니다.

+0

'Expression.Assign'과'Expression.MakeMemberAccess'의 조합은 정확히 무엇입니까? 나는 찾고 있었다. –

1

MemberAssignment을 (를) 이용하여 회원의 가치를 결정하셨습니까?

개체의 필드 또는 속성에 대한 할당 작업을 나타냅니다.

중요 참고 사항 : 그러나 직접 작성할 수 없습니다. 대신

Bind MemberAssignment를 만드는 데 사용하십시오. MemberAssignment의 BindingType 속성은 Assignment입니다. 에 대해 어떻게

+0

'MemberAssignment's의 목록이 있습니다. 기존 객체에 이들을 할당하는'Expression'을 어떻게 만듭니 까? 'Expression.New'를 통해 새 객체를 만들 때 할 수 있지만 기존 객체로 어떻게 할 지 모르겠습니다. –

+0

오랜 시간이 걸렸지 만'new X {Member = y} '와 같이 객체 초기화 프로그램 표현식을위한'MemberAssignment'를 특별히 상기 한 것 같습니다. 평범한 오래된'Assign (Property (x, "Member"), y),'괜찮을 것입니다. –

+0

문서에는 개체 이니셜 라이저식이 언급되어 있지 않습니다. 아마도 [MemberInitExpression] (https://msdn.microsoft.com/en-us/library/system.linq.expressions.memberinitexpression (v = vs.110)) .aspx)? –