38

当我没有实例时,我经常想获取一个类型的实例属性的名称。目前为此,我使用以下内部函数来解释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)所描述的语法实际上是按原样工作的。

4

2 回答 2

56

过去,文档明确解释了这一点,部分内容如下:

在示例中,您可以看到可以使用类型名称并访问实例方法名称。你不需要有一个类型的实例...... [强调我的]

这在当前文档中已被省略。然而,这些例子仍然清楚地表明了这一点。代码示例Console.WriteLine(nameof(List<int>.Count)); // output: CountConsole.WriteLine(nameof(List<int>.Add)); // output: Add演示如何使用类的实例成员的名称nameof来获取值。string

即,您应该能够编写nameof(ClientService.EndDate)并使其工作,这与您在“通常在语法上无效”的问题中的观察相反。

如果您在语法方面遇到问题,请提供一个良好的最小、完整和可验证的代码示例,该示例能够可靠地重现您遇到的任何错误,并提供错误消息的确切文本。

于 2016-07-08T03:50:36.470 回答
4

@Peter Duniho 的回答很好。

如果出现名称冲突,您还可以执行以下操作:

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

效率不高,但足够好奇。

于 2017-11-07T15:04:44.450 回答