铸造的名称

时间:2017-12-14 13:00:40

标签: c# casting nameof

我想使用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)

有人可以解释这个演员+名称问题吗?

3 个答案:

答案 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