42 Stimmen

Wie erhält man den Variablennamen mit Hilfe von Reflection?

Zum Beispiel,

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(someVar));
}

Die Ausgabe dieses Programms sollte sein:

someVar

Wie kann ich das mit Hilfe der Reflexion erreichen?

75voto

Steven Punkte 157957

Mit Reflection ist dies nicht möglich, da die Variablen nach der Kompilierung in AWL keinen Namen mehr haben. Sie können jedoch Ausdrucksbäume verwenden und die Variable zu einer Closure machen:

static string GetVariableName<T>(Expression<Func<T>> expr)
{
    var body = (MemberExpression)expr.Body;

    return body.Member.Name;
}

Sie können diese Methode wie folgt anwenden:

static void Main()
{
    var someVar = 3;

    Console.Write(GetVariableName(() => someVar));
}

Beachten Sie, dass dies ziemlich langsam ist, verwenden Sie es also nicht in leistungsrelevanten Pfaden Ihrer Anwendung. Jedes Mal, wenn dieser Code ausgeführt wird, werden mehrere Objekte erstellt (was zu GC-Druck führt), und unter dem Deckmantel werden viele nicht-inlinierbare Methoden aufgerufen und einige starke Reflexionen verwendet.

Ein ausführlicheres Beispiel finden Sie unter aquí .

UPDATE

Mit C# 6.0 wird die nameof Schlüsselwort in die Sprache aufgenommen, das Folgendes ermöglicht:

static void Main()
{
    var someVar = 3;

    Console.Write(nameof(someVar));
}

Dies ist natürlich viel bequemer und hat die gleichen Kosten hat die Definition der Zeichenfolge als konstante String-Literal.

-1voto

Marcelo Cantos Punkte 173498

Das kann man nicht, wenn man die Reflexion benutzt. GetVariableName wird die Zahl 3 übergeben, nicht eine Variable. Sie könnten dies über Code-Inspektion der IL tun, aber das ist wahrscheinlich in der zu schwer Korb.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X