2010-04-02 6 views
34

Par exemple,Comment obtenir le nom de variable en utilisant la réflexion?

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(someVar)); 
} 

La sortie de ce programme devrait être:

someVar 

Comment puis-je obtenir que l'utilisation de la réflexion?

+1

@helen Ma question est assez simple, par opposition à la dispersion d'une question qu'il a soulevée, ce qui me semble plutôt différent. –

+0

Quel pourrait être le raisonnement derrière cela? – Dested

Répondre

57

Il n'est pas possible de faire cela avec la réflexion, car les variables n'auront pas de nom une fois compilées en IL. Cependant, vous pouvez utiliser des arbres d'expression et de promouvoir la variable à une fermeture:

static string GetVariableName<T>(Expression<Func<T>> expr) 
{ 
    var body = (MemberExpression)expr.Body; 

    return body.Member.Name; 
} 

Vous pouvez utiliser cette méthode comme suit:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(() => someVar)); 
} 

Notez que cela est assez lent, il ne faut pas l'utiliser dans les chemins critiques de performance de votre application. Chaque fois que ce code s'exécute, plusieurs objets sont créés (ce qui provoque une pression GC) et sous la couverture de nombreuses méthodes non-inlinables sont appelées et une forte réflexion est utilisée.

Pour un exemple plus complet, voir here.

MISE À JOUR

Avec C# 6.0, le mot-clé nameof est ajouté à la langue, ce qui nous permet de faire ce qui suit:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(nameof(someVar)); 
} 

Ceci est évidemment beaucoup plus pratique et a le même coût a la définition de la chaîne comme chaîne littérale constante.

+0

Je ne suis pas sûr que ce soit vraiment mauvais en termes de performance. Ce qui peut causer des problèmes de performance est la compilation d'arbres d'expression, mais vous ne le faites pas ici. –

+0

Cherchez vous où 'GetVariableName (() => someVar)' est compilé en utilisant Reflector. Chaque fois que ce code s'exécute, plusieurs objets sont créés et sous la couverture de nombreuses méthodes non-inlinables sont appelées et une réflexion lourde est utilisée. L'utilisation d'arborescences d'expression n'est pas gratuite. – Steven

+0

Oui, vous avez raison. Cela a un coût de performance. Mais c'est "relativement" petit comparant à la compilation des arbres d'expression. –

0

Vous ne pouvez pas, en utilisant la réflexion. GetVariableName est passé le numéro 3, pas une variable. Vous pouvez le faire via l'inspection du code de l'IL, mais c'est probablement dans le panier trop dur.

Questions connexes