Выражение nameof (справочник по C#)
nameof Выражение создает имя переменной, типа или элемента в виде строковой константы. Значение выражения nameof вычисляется во время компиляции, и это не влияет на время выполнения. Если операнд является типом или пространством имен, создаваемое имя не является полным. В следующем примере показано использование nameof выражения:
Console.WriteLine(nameof(System.Collections.Generic)); // output: Generic Console.WriteLine(nameof(List)); // output: List Console.WriteLine(nameof(List.Count)); // output: Count Console.WriteLine(nameof(List.Add)); // output: Add List numbers = [1, 2, 3]; Console.WriteLine(nameof(numbers)); // output: numbers Console.WriteLine(nameof(numbers.Count)); // output: Count Console.WriteLine(nameof(numbers.Add)); // output: Add
С помощью выражения nameof можно сделать код проверки аргументов более удобным:
public string Name < get =>name; set => name = value ?? throw new ArgumentNullException(nameof(value), $" cannot be null"); >
Начиная с версии C# 11, вы можете использовать выражение nameof с параметром метода внутри атрибута в методе или его параметре. В следующем коде показано, как это сделать для атрибута метода, локальной функции и параметра лямбда-выражения.
[ParameterString(nameof(msg))] public static void Method(string msg) < [ParameterString(nameof(T))] void LocalFunction(T param) < >var lambdaExpression = ([ParameterString(nameof(aNumber))] int aNumber) => aNumber.ToString(); >
Выражение nameof с параметром полезно использовать при использовании атрибутов анализа, допускающих значение NULL, или атрибута CallerArgumentExpression.
Если операнд является подробным идентификатором , @ символ не является частью имени, как показано в следующем примере:
var @new = 5; Console.WriteLine(nameof(@new)); // output: new
Спецификация языка C#
См. также
- справочник по C#
- Операторы и выражения C#
- Преобразование typeof в nameof (правило стиля IDE0082)
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Подскажите аналог nameof, чтобы отобразить не только атрибут, но и его вхождения
В своем приложении я часто использую nameof оператор для работы с базой данных через ORM. К примеру, использую nameof(Employee.Id) и вывожу Id соответственно (конечно, мы можем прописывать атрибут через кавычки, но не всегда удается таким образом отследить изменения объекта). Но появилась необходимость в том, чтобы отобразить не только атрибут, но и вхождения, к примеру, какой-нибудь_оператор(Employee.Job.Country.Id) и появился Job.Country.Id, можете подсказать как это сделать? Условно, я хочу чтобы второй nameof(Test.Count.Id) вернул мне Count.Id
var esqTest = new EntitySchemaQuery(userConnection.EntitySchemaManager, nameof(Test)); esqTest.AddAllSchemaColumns(); esqTest.Filters.Add(esqTest.CreateFilterWithParameters(FilterComparisonType.Equal, nameof(Test), selectedRow)); esqTest.Filters.Add(esqTest.CreateFilterWithParameters(FilterComparisonType.Equal, nameof(Test.Count.Id), 2));

Отслеживать
Alex Kleshevnikov
задан 29 мая 2020 в 16:29
Alex Kleshevnikov Alex Kleshevnikov
160 9 9 бронзовых знаков
Оператор nameof() возвращает обычную строку типа string . Следовательно и все строковые операции к нему применимы.
29 мая 2020 в 16:48
@aepot я пытался самостоятельно создать какой-нибудь метод, чтобы распарсить путь (getpath(Employee.Job.Country.Id)), но компилятор запрещает делать такие записи, можно конечно сделать типо nameof(Employee) + nameof(Employee.Country) и т. д., но это долго( подумал, что есть более просто способ.
29 мая 2020 в 16:59
Добавьте весь не рабочий код в вопрос, и объясните, как он работает, и как должен. Приведите примеры данных, конкретные, придумайте тестовый пример, простой, можно на базе отдельного пустого проекта. А пока не понятно, чего вы хотите добиться. nameof — это строка-константа, примочка компилятора, никаких динамических операций с этим у вас не получится.
Nameof c что это
Оператор nameof возвращает имя класса, имя метода, имя переменной.
Оператор nameof вычисляется во время компиляции, и не влияет на время выполнения программы.
namespace ConsoleApplication1
<
class Book
<
public void ShowBook( int price)
<
Console .WriteLine( «Hello!» );
>
>
class Program
<
static void Main( string [] args)
<
// имя класса
string str1 = nameof(Book);
// str1 = «Book»
Console .WriteLine(str1);
// имя метода
string str2 = nameof(Book.ShowBook);
// str2 = «ShowBook»
Console .WriteLine(str2);
// имя переменной
int myYear;
string str3 = nameof(myYear);
// str3 = «myYear»
Console .WriteLine(str3);
>
>
>
Где используется nameof
Пример 1 . Чтобы не писать название переменной лучше использовать nameof
public void ShowReport(MyReportType myReportType, long key)
<
if (myReportType == MyReportType.Film)
<
ShowFilmReport(key);
>
else if (myReportType == MyReportType.Book)
<
ShowCarReport(key);
>
else
<
throw new InvalidOperationException(nameof(myReportType) + » is undefined» ));
>
>
Пример 2 . Чтобы не писать название метода в controller лучше использовать nameof
[HttpPost]
[ActionName(nameof(Add))]
public virtual async Task AddBook(BookViewModel viewModel)
<
.
>
← Previous topic
Аттрибут [Remote(«IsValidAuthor», «Home», ErrorMessage = «Enter correct author of book»)] описывается для свойства в C# классе и проверяет это свойство на правильность на сервере через метод IsValidAuthor в conroller Home, если метод возвращает false, то на экране будет ошибка ErrorMessage в ASP.NET MVC
Оператор nameof C#
В C# оператор nameof используется для получения имени символа в виде строки.
Когда мы используем оператор nameof(Name) , мы получаем строку «Name» .
Если мы используем OnPropertyChanged(nameof(Name)) , мы передаем «Name» в качестве аргумента методу OnPropertyChanged .
Если мы используем OnPropertyChanged(Name) вместо OnPropertyChanged(nameof(Name)) , мы передаем значение переменной Name в качестве аргумента методу OnPropertyChanged .
Таким образом, в первом случае мы передаем имя свойства в виде строки, а во втором случае мы передаем значение свойства.
Обычно OnPropertyChanged используется для уведомления интерфейса пользователя об изменениях свойства в классе.
Если мы передаем значение свойства вместо его имени, интерфейс пользователя не сможет обновиться правильно, так как он не знает, какое свойство было изменено.
Таким образом, использование OnPropertyChanged(nameof(Name)) является более правильным и предпочтительным, так как мы передаем имя свойства в качестве строки, что позволяет интерфейсу пользователя правильно обновляться.
В чем разница OnPropertyChanged(nameof(Name)) и OnPropertyChanged(«Name»)
Обе записи OnPropertyChanged(nameof(Name)) и OnPropertyChanged(«Name») приводят к вызову одного и того же метода OnPropertyChanged с аргументом в виде строки «Name» . Однако, существуют некоторые отличия между этими двумя подходами.
Разница между ними заключается в том, что nameof(Name) проверяет наличие свойства Name на этапе компиляции, тогда как «Name» является строковым литералом, который проверяется только на этапе выполнения. Это означает, что если мы используем OnPropertyChanged(«Name») , и в классе нет свойства с именем «Name» , то мы получим ошибку только на этапе выполнения. Если же мы используем OnPropertyChanged(nameof(Name)) и свойство Name не существует, мы получим ошибку на этапе компиляции.
Еще одним преимуществом использования nameof является то, что оно облегчает рефакторинг кода. Если мы переименуем свойство Name в FullName , то все места, где используется OnPropertyChanged(nameof(Name)) , автоматически будут обновлены на OnPropertyChanged(nameof(FullName)) , что позволяет избежать ошибок, связанных с переименованием свойств.
Таким образом, использование OnPropertyChanged(nameof(Name)) является более безопасным и предпочтительным подходом, так как позволяет проверять наличие свойств на этапе компиляции, облегчает рефакторинг кода и снижает вероятность ошибок во время выполнения.