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 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
Wyrażenia +1 == kod jako dane! Ładnie zrobione –
Co to za odpowiedź na kick ass Ponad milion – Rasmus