Obtener MemberInfo de propiedad del niño de un MemberExpression

c# expression-trees func lambda memberinfo

Pregunta

Estoy tratando de obtener MemberInfo para una propiedad hijo de un MemberExpression. He encontrado formas de obtener el nombre completo del tipo anidado, pero no una forma de obtener la información de miembro completa del tipo anidado. Aquí hay un ejemplo rápido del escenario del que estoy hablando:

Algunos modelos simples (el objetivo es obtener la información de miembro de la propiedad Data de la clase Child)

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

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

La expresión lambda

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

Código utilizado para obtener el MemberInfo de la expresión 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();
    }

Este código funciona muy bien si estuviera tratando de obtener la propiedad principal de la clase principal, pero cuando trato de obtener la información de miembro de la propiedad de datos de la clase secundaria, no funciona. He visto algunas preguntas de StackOverflow publicadas sobre cómo obtener el nombre completo de la propiedad secundaria, pero nada sobre cómo obtener toda la información de los miembros. ¿Alguien ha hecho esto antes o puede ayudarme a orientarme en la dirección correcta?

Respuesta popular

La expresión que obtiene es MemberExpression, puede tomar su propiedad Member directamente:

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

Salida:

System.String Data
Int32 A


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow