La expresión para miembros Tipo genera resultados en diferentes Expresiones (MemberExpression, UnaryExpression)
Tengo una expresión para señalar una propiedad de mi tipo. Pero no funciona para cada tipo de propiedad. "No significa" significa que resulta en diferentes tipos de expresiones. Pensé que alguna vez resultaría en unaMemberExpression
Pero este no es el caso.
porint
yGuid
resulta en unUnaryExpression
y parastring
en unMemberExpression
.
Estoy un poco confundido ;)
Algún código de muestraMi clase
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Código de prueba
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;
Pregunta¿Cómo puedo comparar dos expresiones y verificar si son el mismo tipo y la misma propiedad?
Actualización, respuesta y muestra completaGracias al usuariodasblinkenlight quien me trajo en el camino correcto
Él proporcionó el 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);
}
Escribí el siguiente método de extensión para comparar los resultados delGetMemberExpression
métodos y comprobar siGetMemberExpression().Member.Name
son lo mismo.
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;
}