Может ли оператор C# nameof ссылаться на свойство экземпляра без экземпляра?

Я регулярно хочу получить имя свойства экземпляра типа, когда у меня нет экземпляра. В настоящее время для этого я использую следующую внутреннюю функцию, которая интерпретирует параметр Expression[Func[T, object]] и возвращает имя свойства:

var str = LinqExtensions.NameOf<ClientService>(x => x.EndDate);
// Now str == "EndDate"

Однако кажется позорным не использовать встроенный оператор nameof.

К сожалению, кажется, что оператору nameof требуется либо экземпляр, либо ссылка на статические свойства.

Есть ли изящный способ использовать оператор nameof вместо нашей внутренней функции? Например:

nameof(ClientService.EndDate) // ClientService.EndDate not normally syntactically valid as EndDate is instance member

РЕДАКТИРОВАТЬ

Я был совершенно не прав, описанный синтаксис nameof(ClientService.EndDate) действительно работает как есть.


person Brendan Hill    schedule 08.07.2016    source источник
comment
Это просто работает - class C { public int P { get; } } - nameof(C.P) отлично компилируется.   -  person Eli Arbel    schedule 08.07.2016
comment
Можете ли вы опубликовать свою внутреннюю функцию? ‹_‹   -  person Pangamma    schedule 16.06.2021


Ответы (2)


В прошлом документация явно объясняла это, частично читая:

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

Это было опущено в текущей документации. Тем не менее, примеры все еще показывают это. Образцы кода, такие как Console.WriteLine(nameof(List<int>.Count)); // output: Count и Console.WriteLine(nameof(List<int>.Add)); // output: Add, показывают, как использовать nameof для получения значения string с именем члена экземпляра класса.

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

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

person Peter Duniho    schedule 08.07.2016

Отличный ответ @Peter Duniho.

В случае конфликта имен вы также можете сделать следующее:

ClientService clientservice;
var str = nameof(clientservice.EndDate);

Не эффективно, но достаточно любопытно.

person wonea    schedule 07.11.2017
comment
в случае конфликта имен оба nameof разрешаются в один и тот же текст, поэтому это может не иметь значения - person Andrew Hill; 13.05.2020
comment
@AndrewHill, это плохая идея, потому что половина причины использовать nameof заключается в том, что выполнение рефакторинга IDE (переименование переменной) не пропускается где-то в буквальных строках, выполняя nameof в другом классе, вы повторно вводите этот шанс снова. - person Joel; 18.03.2021
comment
Я получил уведомление о проверке кода. Локальная переменная используется только для захвата ее имени. - person Doctor Coder; 17.04.2021