【问题标题】:Can C# nameof operator reference instance property without instance?C# nameof 运算符可以在没有实例的情况下引用实例属性吗?
【发布时间】:2016-11-10 12:08:54
【问题描述】:

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

【问题讨论】:

  • 它可以正常工作 - class C { public int P { get; } } - nameof(C.P) 编译得很好。
  • 你能发布你的内部功能吗? <_>

标签: c# c#-6.0 nameof


【解决方案1】:

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

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

这在the current documentation 中被省略了。然而,这些例子仍然清楚地表明了这一点。 Console.WriteLine(nameof(List&lt;int&gt;.Count)); // output: CountConsole.WriteLine(nameof(List&lt;int&gt;.Add)); // output: Add 等代码示例展示了如何使用nameof 来获取带有类实例成员名称的string 值。

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

如果您遇到语法问题,请提供一个好的Minimal, Complete, and Verifiable code example,它可以可靠地重现您遇到的任何错误,并提供错误消息的准确文本。

【讨论】:

  • nameof(MyClass.PublicProperty) 的语法仍然有效。它评估为“PublicProperty”。它不是 Intellisense 提供的,但是手动编写它可以编译。
【解决方案2】:

@Peter Duniho 的回答很好。

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

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

效率不高,但足够好奇。

【讨论】:

  • 在名称冲突的情况下,两个名称解析为相同的文本,因此可能无关紧要
  • @AndrewHill 这是个坏主意,因为使用nameof 的一半原因是通过在某处执行nameof 不会在文字字符串中遗漏IDE 重构(重命名变量)一个不同的班级,你又重新引入了这个机会。
  • 我收到代码检查通知“局部变量仅用于捕获其名称”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2020-09-17
  • 2021-09-22
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多