La expresión para miembros Tipo genera resultados en diferentes Expresiones (MemberExpression, UnaryExpression)

Descripción

Tengo una expresión para señalar una propiedad de mi tipo. Pero no funciona para cada tipo de propiedad. "No significa" significa que resulta en diferentes tipos de expresiones. Pensé que alguna vez resultaría en unaMemberExpression Pero este no es el caso.

porint yGuid resulta en unUnaryExpression y parastring en unMemberExpression.

Estoy un poco confundido ;)

Algún código de muestra

Mi clase

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

Código de prueba

Person p = new Person { Age = 16, Name = "John" };

Expression<Func<Person, object>> expression1 = x => x.Age;
// expression1.Body = UnaryExpression;

Expression<Func<Person, object>> expression2 = x => x.Name;
// expression2.Body = MemberExpression;
Pregunta

¿Cómo puedo comparar dos expresiones y verificar si son el mismo tipo y la misma propiedad?

Actualización, respuesta y muestra completa

Gracias al usuariodasblinkenlight quien me trajo en el camino correcto

Él proporcionó el método.

private static MemberExpression GetMemberExpression<T>(
    Expression<Func<T,object>> exp
) {
    var member = expr.Body as MemberExpression;
    var unary = expr.Body as UnaryExpression;
    return member ?? (unary != null ? unary.Operand as MemberExpression : null);
}

Escribí el siguiente método de extensión para comparar los resultados delGetMemberExpression métodos y comprobar siGetMemberExpression().Member.Name son lo mismo.

private static bool IsSameMember<T>(this Expression<Func<T, object>> expr1, Expression<Func<T, object>> expr2)
{
    var result1 = GetMemberExpression(expr1);
    var result2 = GetMemberExpression(expr2);

    if (result1 == null || result2 == null)
       return false;

    return result1.Member.Name == result2.Member.Name;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta