Existe-t-il un meilleur moyen d'obtenir le nom de la propriété lorsqu'il est transmis par une expression lambda ? Voici ce que j'ai actuellement.
eg.
GetSortingInfo<User>(u => u.UserId);
Cela a fonctionné en le coulant en tant qu'expression membranaire uniquement lorsque la propriété était une chaîne de caractères. Comme toutes les propriétés ne sont pas des chaînes de caractères, j'ai dû utiliser l'objet, mais cela renvoie une expression nonary pour celles-ci.
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;
}