2014-11-09 4 views
0

MemberExpression에서 하위 속성에 대한 MemberInfo를 가져 오려고합니다. 중첩 형식의 전체 이름을 가져 오는 방법을 찾았지만 중첩 형식의 전체 MemberInfo를 가져 오는 방법은 찾지 못했습니다. 저는 여기에 대해서 이야기 시나리오의 간단한 예입니다 (목표는 결국 자식 클래스의 데이터 속성 MemberInfo가를 얻는 것입니다)MemberExpression에서 하위 속성의 MemberInfo 가져 오기

일부 간단한 모델은

public class Parent 
{ 
    public int ParentProperty { get; set; } 
    public Child Child { get; set; } 
} 

public class Child 
{ 
    public string Data { get; set; } 
} 

람다 표현식

Expression<Func<Parent,string>> func = new Func<Parent, string>(p => 
{ 
    return p.Child.Data; 
}); 

람다 식에서 MemberInfo를 가져 오는 데 사용되는 코드입니다. 나는 부모 클래스의 ParentProperty을 얻으려고 노력한다면

internal static MemberInfo FindMemberInfoFromLambda(LambdaExpression lambda) 
    { 
     var expression = (Expression) lambda; 
     var flag = false; 

     while (!flag) 
     { 
      switch (expression.NodeType) 
      { 
       case ExpressionType.Convert: 
        expression = ((UnaryExpression) expression).Operand; 
        continue; 
       case ExpressionType.Lambda: 
        expression = ((LambdaExpression) expression).Body; 
        continue; 
       case ExpressionType.MemberAccess: 
        var memberExpression = (MemberExpression) expression; 
        if (memberExpression.Expression.NodeType == ExpressionType.Parameter || 
         memberExpression.Expression.NodeType == ExpressionType.Convert) 
         return memberExpression.Member; 
        throw new Exception(); 
       default: 
        flag = true; 
        continue; 
      } 
     } 
     throw new Exception(); 
    } 

이 코드는 잘 작동하지만, 나는 자식 클래스의 데이터 속성 MemberInfo가 얻을하려고 할 때, 그것은 작동하지 않습니다. 자식 속성의 전체 이름을 가져 오는 것에 게시 된 StackOverflow 질문 몇 개를 보았지만 전체 MemberInfo를 가져 오는 데는 아무 것도 보지 않았습니다. 누구든지 전에 이것을했거나 올바른 방향으로 나를 가리킬 수 있습니까?

+2

좋은, 간결, 전체 코드 예제를 제시해주십시오. 무엇보다도 델리게이트 타입'Func '에서'MemberExpression' 인스턴스로 어떻게 이동하는지 보여줍니다. http://stackoverflow.com/help/mcve 참조하십시오. –

+0

람다 표현식을 가져 와서 MemberType을 가져 오는 방법을 보여주는 코드 예제가 업데이트되었습니다. –

답변

0

이 경우 부모에, 회원이 매개 변수에서 경우 확인하려는 MemberAccess 섹션에서 코드에서 단지 Func을

대신 표현을 사용해야합니다. 당신이 체크를 제거하면 당신은, 만약 변경을

데이터

당신은 매개 변수에 대한 경비를 가지고 왜 모르겠어요이 섹션

case ExpressionType.MemberAccess: 
    var memberExpression = (MemberExpression) expression; 
    if (memberExpression.Expression.NodeType == ExpressionType.Parameter || 
     memberExpression.Expression.NodeType == ExpressionType.Convert) 
     return memberExpression.Member; 
    throw new Exception(); 

case ExpressionType.MemberAccess: 
    var memberExpression = (MemberExpression) expression; 
    return memberExpression.Member; 

하는 방법에 대해 구성원을 얻을 것이다 어떤 경우에는 다른 메소드를 작성하거나 매개 변수를 전달할 필요가 있습니다.

0

당신이 얻을 표현이 MemberExpression은, 당신이 직접 회원 등록을 잡아 수 있습니다

class Program 
{ 
    class Parent 
    { 
     public int A { get; set; } 
     public Child Child { get; set; } 
    } 

    class Child 
    { 
     public string Data { get; set; } 
    } 

    public static MemberInfo GetMemberInfo(LambdaExpression exp) 
    { 
     var body = exp.Body as MemberExpression; 
     return body.Member; 
    } 

    static void Main(string[] args) 
    { 
     Expression<Func<Parent, string>> func1 = p => p.Child.Data; 
     Console.WriteLine(GetMemberInfo(func1)); 
     Expression<Func<Parent, int>> func2 = p => p.A; 
     Console.WriteLine(GetMemberInfo(func2)); 
    } 
} 

출력 :

System.String Data 
Int32 A 
관련 문제