描述
我有一个表达式指向我的类型的属性。但它不适用于每种属性类型。“不意味着”意味着它会导致不同的表达类型。我认为它会导致结果,
MemberExpression
但事实并非如此。
For int
andGuid
它导致 aUnaryExpression
和 forstring
在 a 中MemberExpression
。
我有点困惑 ;)
一些示例代码
我的课
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
测试代码
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;
问题
我如何比较两个表达式并检查它们是否意味着相同的类型和相同的属性?
更新、回答并完成示例
感谢用户dasblinkenlight让我走上了正轨。
他提供了方法
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);
}
我编写了以下扩展方法来比较方法的结果GetMemberExpression
并检查是否GetMemberExpression().Member.Name
相同。
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;
}