2009-03-30 4 views
5

Esta es una pregunta superficial que no puedo responder del todo.Imprimir el nombre de la propiedad (no es lo que piensas)

El programa principal

class Program{ 
    static void Main(string[] args){ 
     Console.WriteLine("Begin"); 
     var myClass = new MyClass(); 
     Util.Print(myClass.Id); 
     Util.Print(myClass.Server); 
     Util.Print(myClass.Ping); 
     Console.WriteLine("End"); 
    } 
} 

¿Cómo se implementa el método Util.Print para conseguir este resultado en la consola:

Begin 
Id 
Server 
Ping 
End 

Respuesta

14

Suponiendo que no quieren utilizar cadenas, los más la respuesta común es a través de Expression - emulando esencialmente el infoof que falta; que tendría que utilizar algo como:

Console.WriteLine("Begin"); 
    var myClass = new MyClass(); 
    Util.Print(() => myClass.Id); 
    Util.Print(() => myClass.Server); 
    Util.Print(() => myClass.Ping); 
    Console.WriteLine("End"); 

Suponiendo que todos son propiedades/campos (edición añadido de apoyo método de llamada):

public static class Util 
{ 
    public static void Print<T>(Expression<Func<T>> expr) 
    { 
     WriteExpression(expr); 
    } 
    public static void Print(Expression<Action> expr) // for "void" methods 
    { 
     WriteExpression(expr); 
    } 
    private static void WriteExpression(Expression expr) 
    { 
     LambdaExpression lambda = (LambdaExpression)expr; 
     switch (lambda.Body.NodeType) 
     { 
      case ExpressionType.MemberAccess: 
       Console.WriteLine(((MemberExpression)lambda.Body) 
        .Member.Name); 
       break; 
      case ExpressionType.Call: 
       Console.WriteLine(((MethodCallExpression)lambda.Body) 
        .Method.Name); 
       break; 
      default: 
       throw new NotSupportedException(); 
     } 
    } 
} 
+1

1 A primera vista, realmente no pensé que podría hacer algo como esto, pero me olvidé por completo de los árboles de expresión y la lectura de los datos del árbol. Excelente ... – bendewey

+0

+1 Expresiones == código como datos! Bien hecho. –

+0

¡Qué respuesta tan patada! . Gracias a un millón – Rasmus

4

Además de la respuesta de Marc: here is an article que explica varios formas de hacer lo que quiere hacer (uno de esos métodos usa expresiones).

+0

También una buena respuesta – Rasmus

-1
public string Id { 
    get { 
     return "Id;" 
    } 
} 

Jeje erm, aunque supongo que eso no es lo que quiere decir :-(La respuesta probablemente será algo que ver con la reflexión.

Tome un vistazo a http://msdn.microsoft.com/en-us/library/ms173183(VS.80).aspx

+0

-1 esto realmente no responde la pregunta de OPs. Creo que realmente está buscando algo que pueda aceptar cualquier propiedad aleatoria – bendewey

+0

+1, este tipo de respuesta resalta la ambigüedad en la pregunta OP y promueve la edición para la clarificación a través de la presión de grupo. – GWLlosa

+0

Iba a evaluar esto, pero estoy de acuerdo con el comentario anterior. OP debería aclarar realmente. Estaba un poco confundido. –

Cuestiones relacionadas