我想使用nameof来获取属性的名称。
以下工作:
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)
有人可以解释这个演员+名称问题吗?
答案 0 :(得分:4)
nameof是一个编译时间,因此是静态的。要获得您想要的,只需使用nameof(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);
}
}
答案 1 :(得分:0)
据我所知,nameof()
基于nameof()
中提供的表达式进行反射。因此,引擎显然有问题反编译"表达式,如果它不是"简单表达"。
您可能有兴趣创建一些扩展方法,该方法将baseClassObj as DerivedClass
作为参数并返回nameof()
的结果。
编辑:nameof()
在编译时进行评估,这是主要原因:)
答案 2 :(得分:0)
nameof基本上作为预处理宏工作。在编译时,它将被参数的实际名称替换,从那里就像一个"常量字符串"在集会中。
The argument expression identifies a code definition, but it is never evaluated.
见这里:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof