Récupération du nom de propriété de l'expression lambda

c# expression-trees lambda linq

Question

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);

Cela fonctionnait en le exprimant en tant qu'expression membre uniquement lorsque la propriété était une chaîne. parce que toutes les propriétés ne sont pas des chaînes, je devais utiliser object, mais cela retournerait une expression unary pour celles-ci.

GetSortingInfo<User>(u => u.UserId);

Réponse acceptée

J'ai trouvé une autre façon de le faire: avoir le type et la propriété fortement typés et déduire explicitement l'entrée du lambda. Pas sûr que ce soit une terminologie correcte, mais voici le résultat.

public static RouteValueDictionary GetInfo<T,P>(this HtmlHelper html, Expression<Func<T, P>> action) where T : class
{
    var expression = (MemberExpression)action.Body;
    string name = expression.Member.Name;

    return GetInfo(html, name);
}

Et puis appelez comme ça.

public static RouteValueDictionary GetInfo<T,P>(this HtmlHelper html, Expression<Func<T, P>> action) where T : class
{
    var expression = (MemberExpression)action.Body;
    string name = expression.Member.Name;

    return GetInfo(html, name);
}

et voila ça marche.
Merci a tous.


Réponse d'expert

Eh bien, il n'est pas nécessaire d'appeler .Name.ToString() , mais en gros, c'est à peu près tout, oui. La seule considération dont vous pourriez avoir besoin est de savoir si x.Foo.Bar doit renvoyer "Foo", "Bar" ou une exception - autrement dit, devez-vous effectuer une itération?

(commentaire) pour plus d'informations sur le tri flexible, voir ici .




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi