Expression <Func<TModel,TValue> &gt; comment puis-je obtenir le nom de TValue?

.net c# expression-trees

Question

//ModelFor(person =>person.Name);
public void ModelFor<TModel, TValue>(
    Expression<Func<TModel, TValue>> expression)
{
    //Result should be "Name"
    string nameOfTValue = ????;     
}

Réponse acceptée

EDIT : Après votre édition, je pense que vous voulez le nom du membre impliqué dans l'expression, en supposant bien sûr que l'expression est un membre-expression en premier lieu.

((MemberExpression)expression.Body).Member.Name

Pour être plus robuste, vous pouvez faire:

((MemberExpression)expression.Body).Member.Name

(Plus pertinent):

Pour obtenir un System.Type qui représente le type de l'argument de type TValue , vous pouvez utiliser l'opérateur typeof .

Vous voulez probablement:

((MemberExpression)expression.Body).Member.Name

Mais considérez également les propriétés FullName et AssemblyQualifiedName , le cas échéant.

Cela n'a vraiment rien à voir avec les arbres d'expression; vous pouvez utiliser cette technique pour obtenir le type d'un argument de type pour toute méthode générique.


Réponse populaire

@Ani: Je ne pense pas que c'est correct, je pense qu'il veut le nom du paramètre dans l'expression du type TValue

Si cela est vrai ... cela ne fonctionne que sur 1 niveau mais peut être utile quand même:

var nameOfTValue = ((MemberExpression)expression.Body).Member.Name; 

Voici une mise en œuvre plus intelligente qui devrait pouvoir traiter à plusieurs niveaux:

var nameOfTValue = ((MemberExpression)expression.Body).Member.Name; 

Usage:

var nameOfTValue = ((MemberExpression)expression.Body).Member.Name; 

Une autre astuce, cela peut être combiné avec réflexion:

var nameOfTValue = ((MemberExpression)expression.Body).Member.Name; 

Permet de définir directement les propriétés avec facilité, peut être utile pour les montages de test:

var nameOfTValue = ((MemberExpression)expression.Body).Member.Name; 



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