説明
自分のタイプのプロパティを指す式があります。ただし、すべてのプロパティ タイプで機能するわけではありません。「意味がない」とは、異なる式タイプになることを意味します。私はそれが結果になると思っていました
MemberExpression
が、そうではありません。
for int
andGuid
それは a UnaryExpression
and for string
in 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;
質問
2 つの式を比較して、それらが同じ型と同じプロパティを意味するかどうかを確認するにはどうすればよいですか?
更新、回答、および完全なサンプル
私を正しい軌道に乗せてくれたユーザー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;
}