Existe-t-il un meilleur moyen d'obtenir le nom de la propriété lorsqu'il est transmis via une expression lambda? Voici ce que j'ai actuellement.
par exemple.
GetSortingInfo<User>(u => u.UserId);
Il a fonctionné en le convertissant en expression de membre uniquement lorsque la propriété était une chaîne. parce que toutes les propriétés ne sont pas des chaînes, j'ai dû utiliser un objet, mais cela retournerait une expression unaire 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;
}
MemberExpression
approche répertoriée ici uniquement pour obtenir le nom du membre, pas pour obtenir le réel MemberInfo
lui-même, car le MemberInfo
retour n'est pas garanti comme étant du type reflété dans certains scénarios "dervied: base". Voir lambda-expression-not-retourner-attendu-memberinfo . M'a fait trébucher une fois. La réponse acceptée en souffre également.