2014-11-09 121 views
0

我想從MemberExpression獲取子屬性的MemberInfo。我已經找到了獲取嵌套類型全名的方法,但沒有辦法獲得嵌套類型的整個MemberInfo。這是我講的場景的一個簡單的例子:從MemberExpression獲取子屬性的MemberInfo

一些簡單的模型(我們的目標是最終獲得兒童類的數據屬性的MemberInfo)

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

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

Lambda表達式

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

用於從lambda表達式獲取MemberInfo的代碼。

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(); 
    } 

此代碼的偉大工程,如果我試圖讓父類的ParentProperty,但是當我試圖讓子類的數據屬性的MemberInfo,這是行不通的。我看到一些StackOverflow問題發佈在獲取子屬性的全名上,但沒有獲得它的整個MemberInfo。有沒有人以前做過或可以幫助我指出正確的方向?

+2

請表現出良好的,簡潔的,完整的代碼示例。其中一個例子顯示瞭如何從委託類型'Func '獲取到'MemberExpression'的一個實例。請參閱http://stackoverflow.com/help/mcve – 2014-11-09 02:02:08

+0

更新了代碼示例,演示瞭如何使用lambda表達式並從中獲取MemberType – 2014-11-09 04:35:51

回答

0

您必須使用表達式,而不只是函數功能

在您檢查,如果該成員是從參數MemberAccess部分代碼,在這種情況下家長。如果刪除檢查,然後你會得到會員的數據

更改本節

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