obtener el nombre de una variable o parámetro

Posible duplicado:
Encontrar el nombre de variable pasado a una función en C #

Me gustaría obtener el nombre de una variable o parámetro:

Por ejemplo si tengo:

var myInput = "input"; var nameOfVar = GETNAME(myInput); // ==> nameOfVar should be = myInput void testName([Type?] myInput) { var nameOfParam = GETNAME(myInput); // ==> nameOfParam should be = myInput } 

¿Cómo puedo hacerlo en C #?

Solución Pre C # 6.0

Puede usar esto para obtener un nombre de cualquier miembro proporcionado:

 public static class MemberInfoGetting { public static string GetMemberName(Expression> memberExpression) { MemberExpression expressionBody = (MemberExpression)memberExpression.Body; return expressionBody.Member.Name; } } 

Para obtener el nombre de una variable:

 string testVariable = "value"; string nameOfTestVariable = MemberInfoGetting.GetMemberName(() => testVariable); 

Para obtener el nombre de un parámetro:

 public class TestClass { public void TestMethod(string param1, string param2) { string nameOfParam1 = MemberInfoGetting.GetMemberName(() => param1); } } 

C # 6.0 y una solución más alta

Puede usar el nombre del operador para parámetros, variables y propiedades por igual:

 string testVariable = "value"; string nameOfTestVariable = nameof(testVariable); 

Lo que está pasando a GETNAME es el valor de myInput , no la definición de myInput sí. La única forma de hacerlo es con una expresión lambda, por ejemplo:

 var nameofVar = GETNAME(() => myInput); 

y de hecho hay ejemplos de eso disponible . ¡Sin embargo! Esto apesta a hacer algo muy mal. Te propondría que reconsiderases por qué lo necesitas. Es casi seguro que no es una buena manera de hacerlo, y obliga a varios gastos generales (la instancia de clase de captura y el árbol de expresión). Además, tiene un impacto en el comstackdor: sin esto, el comstackdor podría haber elegido eliminar esa variable por completo (simplemente usando la stack sin un local formal).

Alternativamente,

1) Sin tocar el System.Reflection nombres System.Reflection ,

 GETNAME(new { myInput }); public static string GETNAME(T myInput) where T : class { if (myInput == null) return string.Empty; return myInput.ToString().TrimStart('{').TrimEnd('}').Split('=')[0].Trim(); } 

2) El de abajo puede ser más rápido (de mis pruebas)

 GETNAME(new { variable }); public static string GETNAME(T myInput) where T : class { if (myInput == null) return string.Empty; return typeof(T).GetProperties()[0].Name; } 

También puede ampliar esto para propiedades de objetos (puede ser con métodos de extensión):

 new { myClass.MyProperty1 }.GETNAME(); 

Puede almacenar en caché los valores de las propiedades para mejorar aún más el rendimiento ya que los nombres de las propiedades no cambian durante el tiempo de ejecución.

El enfoque de expresión va a ser más lento para mi gusto. Para obtener el nombre del parámetro y el valor juntos de una vez, vea esta respuesta mía