2010-04-02 21 views
34

Per esempio,Come ottenere il nome della variabile usando la riflessione?

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(GetVariableName(someVar)); 
} 

L'output di questo programma dovrebbe essere:

someVar 

Come posso ottenere che l'utilizzo di riflessione?

+1

@helen la mia domanda è abbastanza semplice, in contrasto con la dispersione di una domanda che si avvicinò con, che ancora penso piuttosto diversa. –

+0

Quale potrebbe essere il ragionamento dietro questo? – Dested

risposta

57

Non è possibile fare questo con la riflessione, perché le variabili non avranno un nome, una volta compilato a IL. Tuttavia, è possibile utilizzare alberi di espressione e di promuovere la variabile ad una chiusura:

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

    return body.Member.Name; 
} 

È possibile utilizzare questo metodo come segue:

static void Main() 
{ 
    var someVar = 3; 

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

Si noti che questo è abbastanza lento, quindi non lo uso in percorsi di prestazioni critici della vostra applicazione. Ogni volta che questo codice viene eseguito, vengono creati diversi oggetti (che causa la pressione GC) e sotto la copertura molti metodi non inlinable sono chiamati e qualche riflessione pesante viene utilizzato.

Per un esempio più completo, vedere here.

UPDATE

Con C# 6.0, la parola chiave nameof si aggiunge al linguaggio, che ci permette di effettuare le seguenti operazioni:

static void Main() 
{ 
    var someVar = 3; 

    Console.Write(nameof(someVar)); 
} 

Questo è ovviamente molto più conveniente e ha lo stesso costo ha definito la stringa come costante stringa letterale.

+0

Non sono sicuro che sia davvero negativo in termini di prestazioni. Ciò che potrebbe causare problemi di prestazioni è la compilazione di alberi di espressioni, ma non lo fai qui. –

+0

Cerca te stesso in cui 'GetVariableName (() => someVar)' viene compilato per l'utilizzo di Reflector. Ogni volta che questo codice viene eseguito, vengono creati diversi oggetti e sotto la copertura vengono chiamati molti metodi non in-line e viene utilizzata una riflessione pesante. Usare gli alberi di espressione non è gratuito. – Steven

+0

Sì, hai ragione. Ha un costo in termini di prestazioni. Ma è "relativamente" piccolo rispetto alla compilazione di alberi di espressione. –

0

Non si può, utilizzando la riflessione. GetVariableName viene passato il numero 3, non una variabile. Potresti farlo tramite il codice di ispezione dell'IL, ma probabilmente è nel cestino troppo duro.

Problemi correlati