Variablennamen dynamisch abrufen: Alternativen mit Reflection und C# 6.0 erkunden nameof
Den Namen einer Variablen abrufen, nachdem sie in Intermediate kompiliert wurde Sprache (IL) ist eine häufige Herausforderung beim Programmieren. In diesem Artikel befassen wir uns mit der Lösung dieses Problems mithilfe von Reflection, einer leistungsstarken Funktion in .NET, mit der wir Metadaten zu Typen und Mitgliedern zur Laufzeit überprüfen können.
Die Einschränkungen der Reflection
Zunächst könnten wir erwägen, Reflektion zu nutzen, um Variablennamen abzurufen. Es ist jedoch wichtig zu beachten, dass Variablen nach der Kompilierung ihre Namen in IL nicht behalten. Daher führt das alleinige Verlassen auf Reflexion nicht zum gewünschten Ergebnis.
Eingabe von Ausdrucksbäumen und Abschlüssen: Eine Problemumgehung
Trotz der Einschränkungen der Reflexion gibt es eine genialer Workaround. Durch die Verwendung von Ausdrucksbäumen können wir eine Variable zu einem Abschluss heraufstufen. Diese Technik erfasst im Wesentlichen den Kontext der Variablen zur Kompilierungszeit, sodass wir später mithilfe der Funktion „GetVariableName Implementierung und Verwendung Hier ist ein Beispiel, das diesen Ansatz demonstriert: Das Schlüsselwort „nameof“ bietet die gleiche Funktionalität wie die Methode „GetVariableName“, jedoch mit verbesserter Funktionalität Leistung. Fazit Das Abrufen von Variablennamen in .NET erfordert sorgfältige Überlegungen. Während Reflexions- und Ausdrucksbäume eine Problemumgehung für das Abrufen von Variablennamen zur Laufzeit darstellen, müssen ihre Auswirkungen auf die Leistung berücksichtigt werden. Im Gegensatz dazu beseitigt das Schlüsselwort „nameof“ von C# 6.0 diese Leistungsprobleme und dient als effizientere Lösung für diese Aufgabe. Das obige ist der detaillierte Inhalt vonWie kann ich Variablennamen in C# dynamisch abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!static string GetVariableName<T>(Expression<Func<T>> expr)
{
var body = (MemberExpression)expr.Body;
return body.Member.Name;
}
static void Main()
{
var someVar = 3;
Console.Write(GetVariableName(() => someVar));
}</p>
<p>Diese Methode funktioniert durch Extrahieren der MemberExpression-Instanz aus dem Körper des bereitgestellten Lambda-Ausdrucks. Die Member-Eigenschaft der MemberExpression enthält dann den Namen der Variablen.</p>
<p><strong>Nachteile und Leistungsüberlegungen</strong></p>
<p>Diese Problemumgehung umgeht zwar die Einschränkungen der Reflektion, bringt jedoch Leistungseinbußen mit sich. Die Erstellung mehrerer Objekte, übermäßige nicht-inlinierbare Methodenaufrufe und eine starke Verwendung von Reflektion können zu Latenz führen. Es wird daher empfohlen, diesen Ansatz in leistungskritischen Codepfaden zu vermeiden.</p>
<p><strong>C# 6.0-Name des Schlüsselworts: Eine einfachere Lösung</strong></p>
<p>Mit der Einführung von C# 6.0 , ergab sich eine weitaus einfachere Lösung: das Schlüsselwort nameof. Dieses Schlüsselwort bietet eine prägnante und bequeme Möglichkeit, zur Kompilierungszeit auf den Namen einer Variablen, Eigenschaft oder Methode zuzugreifen.</p>
<p>In unserem ursprünglichen Beispiel können wir den Variablennamen jetzt mühelos mit nameof abrufen, wie unten gezeigt: </p>
<pre class="brush:php;toolbar:false">static void Main()
{
var someVar = 3;
Console.Write(nameof(someVar));
}