Expressão para membros do tipo resulta em diferentes expressões (MemberExpression, UnaryExpression)
Eu tenho uma expressão para apontar uma propriedade do meu tipo. Mas isso não funciona para todos os tipos de propriedade. "Não significa" significa resultar em diferentes tipos de expressão. Eu pensei que isso nunca resultaria em umMemberExpression
mas este não é o caso.
Paraint
eGuid
isso resulta em umUnaryExpression
e parastring
em umMemberExpression
.
Eu estou um pouco confuso ;)
Algum código de amostraMinha classe
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Código de teste
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;
QuestãoComo posso comparar duas expressões e verificar se elas significam o mesmo tipo e a mesma propriedade?
Atualizar, responder e completar o exemploObrigado ao usuáriodasblinkenlight quem me trouxe no caminho certo.
Ele forneceu o 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);
}
Eu escrevi o seguinte método de extensão para comparar os resultados doGetMemberExpression
métodos e verifique seGetMemberExpression().Member.Name
são os mesmos.
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;
}