webentwicklung-frage-antwort-db.com.de

Ausdrucksname im .net Framework 4

Der Ausdruck "nameof" wird in Visual Studio 2015 und C # 6 eingeführt

nameof (C # und Visual Basic Reference)

Wie können Sie es verwenden oder eine ähnliche Methode in älteren Versionen wie .net Framework 4 schreiben?.

22
MSL

Wenn Sie von einer Entsprechung für C # vor C # 6 sprechen, erledigt dies den Job (auf eine abgedroschene Weise) für Eigenschaften. Es kann wahrscheinlich um Felder, Methoden usw. erweitert werden.

public static class TestExtension
{
    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
    {
        if (propertyAccessor.Body.NodeType == ExpressionType.MemberAccess)
        {
            var memberExpression = propertyAccessor.Body as MemberExpression;
            if (memberExpression == null)
                return null;
            return memberExpression.Member.Name;
        }
        return null;
    }
}

Wir haben das einfach schnell verbessert, es gibt also noch viel zu verbessern, aber Sie verwenden es wie folgt:

public class myClass
{
    public string myProp { get; set; }
}

var a = new myClass();
var result = a.nameof(b => b.myProp);

Ergebnis enthält 'myProp'

pdate:

Umfassender (wenn auch noch nicht so hübsch)

public static class TestExtension
{
    public static String nameof<T, TT>(this Expression<Func<T, TT>> accessor)
    {
        return nameof(accessor.Body);
    }

    public static String nameof<T>(this Expression<Func<T>> accessor)
    {
        return nameof(accessor.Body);
    }

    public static String nameof<T, TT>(this T obj, Expression<Func<T, TT>> propertyAccessor)
    {
        return nameof(propertyAccessor.Body);
    }

    private static String nameof(Expression expression)
    {
        if (expression.NodeType == ExpressionType.MemberAccess)
        {
            var memberExpression = expression as MemberExpression;
            if (memberExpression == null)
                return null;
            return memberExpression.Member.Name;
        }
        return null;
    }
}

Zugriff auf statische Eigenschaften/Felder:

TestExtension.nameof(() => myClass.MyOtherField)

Zugriff auf Parameter innerhalb von Funktionen:

void func (int a) {
    TestExtension.nameof(() => a);
}
27
Rob

nameOf - Wird um Compiletime aufgelöst - Wenn Sie dekompilieren, werden Sie feststellen, dass der Compiler stattdessen den Klassennamen (ohne den Namespace (!)) in eine konstante Zeichenfolge übersetzt hat. Also sei vorsichtig!

Wenn Sie den Namen einer Klasse erhalten möchten, verwenden Sie typeof() oder GetType(), um den spezifischen (möglicherweise abgeleiteten) Typ bei Runtime abzurufen und den Wert von zu lesen
das .Name- Eigenschaft in .net <C # 6.

Lesen Sie mehr unter MSDN

4
Cadburry

Meines Wissens gibt es drei Möglichkeiten, keine magische Schnur verwenden zu müssen

  1. nameof , für das Visual Studio 2015 erforderlich ist (Kann jedoch auch mit anderen Versionen des .net-Frameworks kompiliert werden)

    nameof(this.Property)
    
  2. verwenden Sie eine Methode, die einen Ausdruck verwendet und den in diesem Beitrag angegebenen Eigenschaftsnamen zurückgibt. " Ruft den Zeichenfolgennamen der Eigenschaft mithilfe von Reflection ab. "

    var propertyName = GetPropertyName(  
        () => myObject.AProperty); // returns "AProperty"
    
  3. CallerMemberNameAttribute - (Nur in .NET Framework 4.5 verfügbar, enthalten, da der ursprüngliche Post ältere Versionen wie .NET Framework 4.0 enthielt, die vermutlich 4.5 enthalten.) Der Nachteil dieser Methode ist, dass sie nur dann nützlich ist, wenn Sie die aktuelle Methode als String darstellen müssen Sie operieren in.

    public string IsChecked  {
       set{
           Console.WriteLine(GetCurrentMemberName()); // prints "IsChecked"
       }
    }
    
    string GetCurrentMemberName([CallerMemberName] string memberName = "")
    {
         return memberName;
    }
    
2
JamesF

Der Operator nameof gibt eine Zeichenfolgendarstellung der übergebenen Variablen zurück, sodass nameof (var1) "var1" zurückgibt. Dies ist nützlich, um Code zu vermeiden, bei dem Variablennamen als Zeichenfolgen wie in Argumentausnahmen angegeben werden müssen.

In früheren Versionen konnten Sie mit Reflexions- oder Ausdrucksbäumen einen ähnlichen Effekt erzielen.

1
BhavO