C# 铸件名称

C# 铸件名称,c#,casting,nameof,C#,Casting,Nameof,我想使用nameof来获取属性的名称 以下工作: DerivedClass EC = baseClassObj as DerivedClass; nameof(EC.propertyX) nameof((baseClassObj as DerivedClass).propertyX) 但这不起作用: DerivedClass EC = baseClassObj as DerivedClass; nameof(EC.propertyX) nameof((baseClassObj as Der

我想使用nameof来获取属性的名称

以下工作:

DerivedClass EC = baseClassObj as DerivedClass;
nameof(EC.propertyX)
nameof((baseClassObj as DerivedClass).propertyX)
但这不起作用:

DerivedClass EC = baseClassObj as DerivedClass;
nameof(EC.propertyX)
nameof((baseClassObj as DerivedClass).propertyX)
编译错误为:

Sub-expression cannot be used in an argument to nameof
顺便说一句,这也不行:

nameof(((baseClassObj)DerivedClass).propertyX)

有人能解释这个casting+nameof问题吗?

据我所知,
nameof()
根据
nameof()中提供的表达式进行反射。因此,如果表达式不是“简单表达式”,那么引擎显然存在“反编译”表达式的问题

您可能有兴趣创建一些扩展方法,该方法将
baseClassObj作为DerivedClass
作为参数,并返回
nameof()
的结果


编辑:
nameof()
是在编译时计算的,这是主要原因:)

nameof基本上是作为一个预处理的宏来工作的。在编译时之前,它将被参数的实际名称替换,从那里开始,它就像程序集中的“常量字符串”

参数表达式标识代码定义,但从未对其求值。

请参见此处:

nameof是编译时的东西,因此是静态的。要获得所需内容,只需使用nameof(DerivedClass.PropertyX):


除了为您找到语言规范或查看文档之外,没有其他解释。它根本不受支持。错误解释了一切。不允许子表达式作为
nameof
的参数。尝试将
(baseClassObj作为DerivedClass)
存储到一个变量中,并在nameof参数中使用该变量。正如RATM常说的:“然后转换nameof”。现在你按照他们告诉你的去做,这就是为什么你不能在一个常量中使用你想要的每一个表达式的原因:编译器需要能够在编译时对表达式求值。这意味着您只能执行编译器实际可以执行的操作。
nameof
的可能重复与反射完全无关。当反射发生在运行时时,它是一个纯编译时特性。