¿Hay una mejor manera de obtener el nombre de la Propiedad cuando se pasa a través de una expresión lambda? Esto es lo que tengo actualmente.
p.ej.
GetSortingInfo<User>(u => u.UserId);
Funcionó lanzándolo como una expresión membere solo cuando la propiedad era una cadena. porque no todas las propiedades son cadenas, tuve que usar un objeto, pero luego devolvería una expresión no lineal para ellas.
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
enfoque que se enumera aquí solo para obtener el nombre del miembro, no para obtener el verdadero en MemberInfo
sí mismo, porque MemberInfo
no se garantiza que la devolución sea del tipo reflejado en ciertos escenarios "derivados: base". Ver lambda-expression-not-return-expect-memberinfo . Me hizo tropezar una vez. La respuesta aceptada también sufre de esto.