2009-03-30 11 views
5

To jest pobieżne pytanie, na które nie mogę odpowiedzieć.Drukuj nazwę właściwości (nie jest to, co myślisz)

Główny program

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"); 
    } 
} 

Jak zaimplementować metodę Util.Print dostać to wyjście do konsoli:

Begin 
Id 
Server 
Ping 
End 

Odpowiedz

14

Zakładając, że nie chcesz używać strun, najbardziej wspólną odpowiedzią jest Expression - w zasadzie naśladująca brakujące infoof; trzeba by użyć czegoś takiego:

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

Zakładając, że są wszystkie właściwości/pola (edit dodano wsparcie metoda-call):

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 na pierwszy rzut oka i tak naprawdę nie myślał, że mógłby zrobić coś takiego, ale zupełnie zapomniałem o drzewach ekspresji i odczytaniu danych z drzewa ... – bendewey

+0

Wyrażenia +1 == kod jako dane! Ładnie zrobione –

+0

Co to za odpowiedź na kick ass Ponad milion – Rasmus

4

Oprócz Marca odpowiedź: here is an article którym opisano kilka sposoby robienia tego, co chcesz zrobić (jedna z takich metod używa wyrażeń).

+0

Również dobra odpowiedź – Rasmus

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

Hehe erm, choć sądzę, że nie o to ci chodzi :-(Odpowiedź będzie prawdopodobnie coś z refleksji.

Spójrz na http://msdn.microsoft.com/en-us/library/ms173183(VS.80).aspx

+0

-1 to tak naprawdę nie odpowiada na pytanie OP. Myślę, że naprawdę szuka czegoś, co może zaakceptować dowolną losową właściwość. – bendewey

+0

+1, ten rodzaj odpowiedzi podkreśla niejednoznaczność w pytaniu OP i promuje edycję dla wyjaśnienia poprzez presję rówieśników. – GWLlosa

+0

Oceniłem to, ale zgadzam się z komentarzem znajdującym się przede mną. PO powinien naprawdę wyjaśnić. Byłem trochę zmieszany. –