¿Cómo obtener el nombre de la variable usando la reflexión?

Por ejemplo,

static void Main() { var someVar = 3; Console.Write(GetVariableName(someVar)); } 

El resultado de este progtwig debería ser:

 someVar 

¿Cómo puedo lograr eso usando la reflexión?

No es posible hacer esto con la reflexión, porque las variables no tendrán un nombre una vez comstackda en IL. Sin embargo, puede usar árboles de expresión y promover la variable a un cierre:

 static string GetVariableName(Expression> expr) { var body = (MemberExpression)expr.Body; return body.Member.Name; } 

Puede usar este método de la siguiente manera:

 static void Main() { var someVar = 3; Console.Write(GetVariableName(() => someVar)); } 

Tenga en cuenta que esto es bastante lento, así que no lo use en rutas críticas de rendimiento de su aplicación. Cada vez que se ejecuta este código, se crean varios objetos (lo que provoca la presión del GC) y debajo de la cubierta se invocan muchos métodos no insertables y se utiliza una reflexión intensa.

Para un ejemplo más completo, mira aquí .

ACTUALIZAR

Con C # 6.0, el nameof palabra clave se agrega al idioma, lo que nos permite hacer lo siguiente:

 static void Main() { var someVar = 3; Console.Write(nameof(someVar)); } 

Obviamente, esto es mucho más conveniente y tiene el mismo costo al definir la cadena como literal de cadena constante.

No puedes, usando la reflexión. GetVariableName se pasa el número 3, no una variable. Podrías hacer esto a través de la inspección del código del IL, pero eso probablemente esté en la canasta demasiado dura.