Wyrażenie dla członków typu powoduje różne wyrażenia (MemberExpression, UnaryExpression)
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 kodyMoja 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;
PytanieJak 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;
}