Expressão para membros do tipo resulta em diferentes expressões (MemberExpression, UnaryExpression)

Descrição

Eu tenho uma expressão para apontar uma propriedade do meu tipo. Mas isso não funciona para todos os tipos de propriedade. "Não significa" significa resultar em diferentes tipos de expressão. Eu pensei que isso nunca resultaria em umMemberExpression mas este não é o caso.

Paraint eGuid isso resulta em umUnaryExpression e parastring em umMemberExpression.

Eu estou um pouco confuso ;)

Algum código de amostra

Minha classe

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

Código de teste

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;
Questão

Como posso comparar duas expressões e verificar se elas significam o mesmo tipo e a mesma propriedade?

Atualizar, responder e completar o exemplo

Obrigado ao usuáriodasblinkenlight quem me trouxe no caminho certo.

Ele forneceu o 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);
}

Eu escrevi o seguinte método de extensão para comparar os resultados doGetMemberExpression métodos e verifique seGetMemberExpression().Member.Name são os mesmos.

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

questionAnswers(2)

yourAnswerToTheQuestion