2009-04-08 66 views
9

i tiene declaraciónimprimir nombre de la variable en C#

int A = 10,B=6,C=5; 

y quiero escribir una función de impresión de tal manera que me pase la variable int a ella y me imprime el nombre de la variable y el valor.

por ejemplo, si yo llamo de impresión (A) debe volver "A: 10", y la impresión (B), entonces debe volver "B: 6"

en resumen me gustaría saber cómo puedo acceder el nombre de la variable e imprímalo en la cadena en C#. ¿Tengo que usar la reflexión?

Después de leer las respuestas

Hola a todos, gracias por las sugerencias. Los probaré, sin embargo, quería saber si es posible en .NET 2.0. Nada similar a

#define prt(x) std::cout << #x " = '" << x << "'" << std::endl; 

macro que se encuentra en C/C++?

Respuesta

25

La única forma sensata de hacer esto sería usar la API Expression; pero eso cambia el código aún más ...

static void Main() { 
    int A = 10, B = 6, C = 5; 
    Print(() => A); 
} 
static void Print<T>(Expression<Func<T>> expression) { 
    Console.WriteLine("{0}={1}", 
     ((MemberExpression)expression.Body).Member.Name, 
     expression.Compile()()); 
} 

Nota: si esto es para fines de depuración, asegúrese de agregar [Conditional("DEBUG")] al método, como el uso de una variable de esta manera cambia la naturaleza del código de sutil formas.

+0

Wow. Esto es asombroso Buen trabajo. –

+0

Hola Marc, nada similar a #define prt (x) std :: cout << #x "= '" << x << "'" << std :: endl; está en C#? –

+0

Aprende algo nuevo en SO todos los días. – womp

5

Esto no es posible sin un poco de "ayuda" del sitio de llamadas; incluso la reflexión no sabe sobre los nombres de las variables locales.

+0

Es posible en C# 3.0 y expresiones lambda. – TcKs

+0

@TcKs: Estrictamente hablando, necesita .NET 3.5 y C# 3.0 –

+0

La pregunta dice "imprimir (A)" - no es posible. – Brian

2

Esto no es posible con la reflexión (ver Brian y Joel). En general, esto no es posible simplemente porque no puede garantizar que se pase un valor con nombre a su función de impresión. Por ejemplo, podría hacer tan fácilmente lo siguiente

print(42); 
print(A + 42); 

Ninguna de estas expresiones tiene realmente un nombre. ¿Qué esperas imprimir aquí?

+0

No estoy seguro de por qué he votado aquí. – JaredPar

+0

Creo que se supone que se pasará un nombre de variable a la función, ya que el usuario usará el programa. Aunque tu línea de pensamiento es correcta. Es solo mi Punto de vista. –

7

Puede usar expresiones lambda:

static void Main(string[] args) { 
    int A = 50, B = 30, C = 17; 
    Print(() => A); 
    Print(() => B); 
    Print(() => C); 
} 

static void Print<T>(System.Linq.Expressions.Expression<Func<T>> input) { 
    System.Linq.Expressions.LambdaExpression lambda = (System.Linq.Expressions.LambdaExpression)input; 
    System.Linq.Expressions.MemberExpression member = (System.Linq.Expressions.MemberExpression)lambda.Body; 

    var result = input.Compile()(); 
    Console.WriteLine("{0}: {1}", member.Member.Name, result); 
} 
2

Otra solución (de una closed post):

Inspirado por Jon Skeet de post sobre el manejo de excepciones nulo de referencia y de repente se nos recuerde acerca de proyección hay una manera de un poco haz eso.

Aquí es completa codez de trabajo:

public static class ObjectExtensions { 
    public static string GetVariableName<T>(this T obj) { 
     System.Reflection.PropertyInfo[] objGetTypeGetProperties = obj.GetType().GetProperties(); 

     if(objGetTypeGetProperties.Length == 1) 
      return objGetTypeGetProperties[0].Name; 
     else 
      throw new ArgumentException("object must contain one property"); 
    } 
} 

class Program { 
    static void Main(string[] args) { 
     string strName = "sdsd"; 
     Console.WriteLine(new {strName}.GetVariableName()); 

     int intName = 2343; 
     Console.WriteLine(new { intName }.GetVariableName()); 
    } 
} 
+0

Esto hace que la pregunta sea completamente factible. Simplemente agregue un método llamado prt (object obj) que luego llama al nuevo {obj} .GVN(); método. – mikeschuld

0

aquí en el futuro sólo tiene que utilizar el operador nombredel.

Cuestiones relacionadas