2014-05-09 2 views
1

강력한 형식의 문 본문에서 할당을 캡처 할 수있는 메서드를 작성하려고합니다. 메서드 호출은 다음과 같아야합니다.MemberAssignments 가져 오기

myObject.Assign(o => 
       { 
        o.SomeProperty = 1; 
        o.AnotherProperty = "two"; 
       }); 

할당 목록을 얻고 싶습니다. MemberAssignment 인스턴스의 배열이 적합하다고 보입니다.

Assign()의 메소드 헤더가 어떻게 보이는지 알아내는 것이 불투명합니다.

는 여기에 내가 현재 가지고있는 작업은 다음과 같습니다

성명 본체와 여러 과제와
public class MyClass 
{ 
    public void Assign(System.Linq.Expressions.Expression<System.Action<MyBunchOfProps>> assignments) 
    { 

    } 
} 

public struct MyBunchOfProps 
{ 
    public int SomeProperty { get; set; } 
    public string AnotherProperty { get; set; } 
} 

, 나는 "성명 본체와 람다 표현식은 식 트리로 변환 할 수 없습니다"얻을.

본문을 생략하고 하나의 과제 (myObject.Assign(o => o.SomeProperty = 1);) 만 수행하면 대신 "표현식 트리에 할당 연산자가 포함되어 있지 않을 수 있습니다"가 표시됩니다.

Expression이 아닌 다른 클래스를 사용해야합니까?

답변

2

많은 수의 배정을 포함하는 표현식 트리를 분석하기는 쉽지만 불행히도 C#은 컴파일러 오류가 나타내는대로 lambdas을 통해 할당 또는 명령문을 사용하여 표현식 트리를 만들 수 없습니다.

(구성원 액세스 람다, 개체) 튜플 목록을 보유 할 수있는 사용자 지정 개체를 만들어 대신 사용하는 것이 좋습니다.

public class AssignmentList<T> : IEnumerable<Tuple<LambdaExpression, object>> 
{ 
    private readonly List<Tuple<LambdaExpression, object>> _list 
      = new List<Tuple<LambdaExpression, object>>(); 

    public void Add<TProperty>(Expression<Func<T, TProperty>> selector, TProperty value) 
    { 
     _list.Add(Tuple.Create<LambdaExpression, object>(selector, value));  
    } 

    public IEnumerator<Tuple<LambdaExpression, object>> GetEnumerator() 
    { 
     return _list.GetEnumerator(); 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
: 여기
var list = new AssignmentList<MyBunchOfProps> 
      { 
       { o => o.SomeProperty, 1 }, 
       { o => o.AnotherProperty, "two" } 
      }; 

이에 대한 예제 구현의 :

예를 들어,이 구문을 허용 할 클래스를 생성 할 수 있어야한다