Existe uma maneira melhor de obter o nome da propriedade quando transmitida por meio de uma expressão lambda? Aqui está o que eu tenho atualmente.
por exemplo.
GetSortingInfo<User>(u => u.UserId);
Funcionou lançando-o como uma expressão membere apenas quando a propriedade era uma string. porque nem todas as propriedades são seqüências de caracteres, eu tive que usar o objeto, mas isso retornaria uma expressão unária para elas.
public static RouteValueDictionary GetInfo<T>(this HtmlHelper html,
Expression<Func<T, object>> action) where T : class
{
var expression = GetMemberInfo(action);
string name = expression.Member.Name;
return GetInfo(html, name);
}
private static MemberExpression GetMemberInfo(Expression method)
{
LambdaExpression lambda = method as LambdaExpression;
if (lambda == null)
throw new ArgumentNullException("method");
MemberExpression memberExpr = null;
if (lambda.Body.NodeType == ExpressionType.Convert)
{
memberExpr =
((UnaryExpression)lambda.Body).Operand as MemberExpression;
}
else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpr = lambda.Body as MemberExpression;
}
if (memberExpr == null)
throw new ArgumentException("method");
return memberExpr;
}
MemberExpression
abordagem listada aqui apenas para obter o nome do membro, não para obter o nome realMemberInfo
propriamente dito, porque MemberInfo
não é garantido que o retorno seja do tipo refletido em certos cenários "dervied: base". Consulte expressão lambda-não-retornando-esperado-memberinfo . Me tropeçou uma vez. A resposta aceita também sofre com isso.