Ottieni MemberInfo della proprietà figlio da un membroExpression

c# expression-trees func lambda memberinfo

Domanda

Sto cercando di ottenere MemberInfo per una proprietà figlio da un membroExpression. Ho trovato dei modi per ottenere il nome completo del tipo annidato, ma non un modo per ottenere l'intero MemberInfo del tipo annidato. Ecco un rapido esempio dello scenario di cui sto parlando:

Alcuni modelli semplici (l'obiettivo è di ottenere finalmente MemberInfo della proprietà Data della classe Child)

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

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

L'espressione lambda

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

Codice utilizzato per ottenere MemberInfo dall'espressione lambda.

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

Questo codice funziona in modo ottimale se provassi a ottenere la proprietà Parent della classe Parent, ma quando provo ad ottenere MemberInfo della proprietà Data della classe Child, non funziona. Ho visto alcune domande StackOverflow pubblicate su come ottenere il nome completo della proprietà child, ma nulla su come ottenere l'intero MemberInfo di esso. Qualcuno l'ha già fatto prima o può aiutarmi a indicarmi la giusta direzione?

Risposta popolare

L'espressione che ottieni è MemberExpression, puoi prendere direttamente la sua proprietà Member:

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

Produzione:

System.String Data
Int32 A


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché