C#中的nameof运算符可以引用实例属性而无需实例吗?

48

当我没有实例时,我经常想获取类型的实例属性名称。目前,为了做到这一点,我使用以下内部函数来解释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)语法实际上可以原封不动地使用。


2
它只是有效的 - class C { public int P { get; } } - nameof(C.P) 编译得很好。 - Eli Arbel
你能发布你们内部的函数吗?<_< - Pangamma
2个回答

63
过去,文档明确解释了这一点,部分内容如下:
在示例中,您可以看到您可以使用类型名称并访问实例方法名称。 您不需要具有该类型的实例...[强调是我的]。 当前文档中已省略此内容。但是,示例仍然清楚地说明了这一点。例如,代码示例Console.WriteLine(nameof(List<int>.Count)); // output: CountConsole.WriteLine(nameof(List<int>.Add)); // output: Add展示了如何使用nameof获取类的实例成员名称的string值。
即应该能够编写nameof(ClientService.EndDate)并使其工作,与您在问题中观察到的相反,这可能是“通常不符合语法”的。
如果您在语法方面遇到问题,请提供一个良好的Minimal, Complete, and Verifiable code example,该示例可以可靠地重现您遇到的任何错误,并提供错误消息的确切文本。

4
nameof(MyClass.PublicProperty) 的语法仍然有效。它的评估结果为“PublicProperty”。虽然Intellisense没有提供它,但手动编写可以正常编译。 - Martin Kunc

4

@Peter Duniho的回答非常好。

在名称冲突的情况下,您还可以执行以下操作:

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

虽然不高效,但是很有趣。


1
在名称冲突的情况下,两个“名称”都将解析为相同的文本,因此可能并不重要。 - Andrew Hill
1
@AndrewHill 这是个不好的想法,因为使用 nameof 的一半原因是为了确保在文字字符串中进行 IDE 重构(重命名变量)时不会遗漏,通过在不同类上执行 nameof,你又重新引入了这种可能性。 - Issung
我收到了代码检查通知:“本地变量仅用于捕获其名称”。 - Doctor Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接