我想使用名称以获取属性的名称。
以下工作:
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)
有人可以解释这个铸造 名称问题吗?
名称是编译时间的东西,因此是静态的。要获得想要的东西,只需使用名称(derivedclass.propertyx):
class BaseClass
{
}
class DerivedClass : BaseClass
{
public string PropertyX { get; set; }
}
static class UsePropertyName
{
public static string GetPropertyName(BaseClass classInstance)
{
//Instance not actually used.
return nameof(DerivedClass.PropertyX);
}
}
名称基本上是作为预处理宏的工作。在编译时间之前,它将被参数的实际名称替换,从那里开始,它就像汇编中的"常数"字符串。
The argument expression identifies a code definition, but it is never evaluated.
请参阅此处:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof
,nameof()
基于nameof()
中提供的表达式进行反射。因此,如果不是"简单的表达式",则引擎显然有问题"对"表达式"反编译"。
您可能有兴趣创建一些将baseClassObj as DerivedClass
作为参数的扩展方法并返回nameof()
的结果。
编辑:nameof()
在编译时间内评估,这是主要原因:)