nameof выражение in.net рамки 4

выражение"nameof" введено в Visual Studio 2015 и c# 6

nameof (Справочник по C# и Visual Basic)

Как вы можете использовать его или написать аналогичный метод в более старых версиях, таких как .net framework 4.

4 ответов


если вы говорите об эквиваленте для C# до C#6, это позволит выполнить работу (в хакерском стиле) для свойств. Вероятно, его можно расширить, чтобы включить поля, методы и т. д.

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

только что выдумал это быстро, так что есть много, чтобы быть улучшены, но вы используете его так:

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

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

результат содержит 'myProp'

обновление:

более полный (хотя все равно не то довольно)

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

доступ к статическим свойствам/полям:

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

доступ к параметрам в пределах функций:

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

nameOf - решается на Compiletime - Если вы декомпилируете, вы увидите, что компилятор только что перевел имя класса (без пространства имен (!)) вместо этого в постоянную строку. Так что будьте бдительны!

если вы хотите получить имя класса использовать typeof() или GetType() чтобы получить конкретный (возможно, производный) тип в Runtime и прочитайте значение
the .Name - свойство в .net

подробнее на MSDN


насколько мне известно, есть три варианта, чтобы не использовать волшебную строку

  1. nameof который требует Visual Studio 2015 (но может быть скомпилирован в другие версии .NET framework)

    nameof(this.Property)
    
  2. используйте метод, который принимает выражение и возвращает имя свойства, как найдено в этом сообщении"получить строковое имя свойства с помощью отражение!--15-->"

    var propertyName = GetPropertyName(  
        () => myObject.AProperty); // returns "AProperty"
    
  3. CallerMemberNameAttribute - (доступно только в .net framework 4.5, включено, потому что исходный пост сказал более старые версии, такие как .net framework 4.0, который, я думаю, включает 4.5) обратная сторона этого метода полезна только тогда, когда вам нужно строковое представление текущего метода, в котором вы работаете.

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

оператор nameof возвращает строковое представление переменной, которую вы передали, поэтому nameof (var1) вернет "var1", его полезно во избежание кода, где мы должны указать имена переменных как строки, как в исключениях аргументов.

в предыдущих версиях вы могли бы достичь аналогичного эффекта, используя отражение или деревья выражений.