Wyrażenie dla członków typu powoduje różne wyrażenia (MemberExpression, UnaryExpression)

Opis

Mam wyrażenie wskazujące właściwość mojego typu. Ale nie działa dla każdego typu właściwości. „Nie znaczy” oznacza, że ​​powoduje to różne typy ekspresji. Myślałem, że to kiedykolwiek spowodujeMemberExpression ale tak nie jest.

Dlaint iGuid skutkuje aUnaryExpression i dlastring wMemberExpression.

Jestem trochę zmieszany ;)

Niektóre przykładowe kody

Moja klasa

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

Kod testu

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

Jak mogę porównać dwa wyrażenia i sprawdzić, czy mają one ten sam typ i tę samą właściwość?

Zaktualizuj, odbierz i uzupełnij próbkę

Dzięki dla użytkownikadasblinkenlight który przyprowadził mnie na właściwy tor.

Podał metodę

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

Napisałem następującą metodę rozszerzenia, aby porównać wynikiGetMemberExpression metody i sprawdź, czyGetMemberExpression().Member.Name są takie same.

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