День сто третий. #ЗаметкиНаПолях

Метод nameof

Метод nameof используется для получения простого строкового имени переменной, типа или члена типа. Например:

string text;

WriteLine(nameof(text)); // "text"

WriteLine(nameof(person.Address.ZipCode)); // "ZipCode"



Примеры Использования

1. Валидация параметров:

void f(string s) {

if (s == null) throw new ArgumentNullException(nameof(s));

}

2. Ссылки ActionLink в MVC:

<%= Html.ActionLink("Sign up",

@typeof(UserController),

@nameof(UserController.SignUp))

%>

3. Реализация INotifyPropertyChanged:

int p {

get { return this.p; }

set { this.p = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(p)); }

}

4. DependencyProperty в XAML:

public static DependencyProperty AgeProperty = DependencyProperty.Register(nameof(Age), typeof(int), typeof(C));

5. Запись в журнал:

void f(int i) {

Log(nameof(f), "method entry");

}

6. Атрибуты:

[DebuggerDisplay("={" + nameof(GetString) + "()}")]

class C {

string GetString() { }

}



Примечания

Аргументом для nameof должно быть простое имя, полное имя, доступ к членам, базовый доступ с заданным членом или доступ к this с указанным членом. Выражение аргумента идентифицирует определение кода, но никогда не вычисляется.

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

- предопределенные типы (например, int или void),

- обнуляемые типы (Point?),

- массивы (Customer[,]),

- указатели (Buffer*),

- полные псевдонимы (A::B)

- несвязанные универсальные типы (Dictionary<,>),

- идентификаторы препроцессора (DEBUG),

- метки (loop:).



Сведения о сигнатурах, например "Method1 (str, str)", получить невозможно. Чтобы это сделать, можно использовать выражение (Expression e = () => A.B.Method1("s1", "s2")) и извлечь MemberInfo из результирующего дерева выражения.



Источник: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof