1

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

有人可以解释这个铸造+名称问题吗?

4

3 回答 3

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);
    }
}
于 2017-12-14T13:16:34.603 回答
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

于 2017-12-14T13:09:25.293 回答
-1

据我所知,nameof()基于nameof(). 因此,如果它不是“简单表达式”,引擎显然有“反编译”表达式的问题。

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

编辑:nameof()在编译时进行评估,这是主要原因:)

于 2017-12-14T13:07:46.310 回答