如何处理nameof(this)来报告类名

时间:2015-01-08 10:26:56

标签: c# c#-6.0 nameof

我想使用以下C#6代码

var joe = new Self();
Console.WriteLine(joe);

...并获得以下输出:

  

以下尝试

class Self {
  public string Name { get; set; } = nameof(this);
  public override string ToString() {
    return Name;
  }
}

失败,因为nameof无法应用于this。是否有解决此问题的方法?

修改即可。我正在使用的方案确保没有两个引用指向同一个Self对象。

5 个答案:

答案 0 :(得分:14)

不,nameof旨在引用您所指的成员的编译时名称。如果您希望某个对象具有Name属性作为其状态的一部分,那么这与 Name属性的方式无关 - 正如FrédéricHamidi所说,可能是多个变量(或没有)引用同一个对象。基本上,您需要区分对象和恰好引用该对象的变量。

但是,如果您有一个构造函数来指定名称,那么您可以使用一些技巧来更容易地获得正确的名称:

class Self
{
    public string Name { get; }

    public Self([CallerMemberName] string name = null)
    {
        this.Name = name;
    }
}

然后:

class Foo
{
    private Self me = new Self(); // Equivalent to new Self("me")

    public void SomeMethod()
    {
        // Can't use the default here, as it would be "SomeMethod".
        // But we can use nameof...
        var joe = new Self(nameof(joe));
    }
}

答案 1 :(得分:5)

您只需对变量本身使用nameof

Console.WriteLine(nameof(joe));

Here是使用当前Roslyn版本

的工作示例

答案 2 :(得分:1)

也许您可以使用以下方法:

    class Self
    {
       public override string ToString()
       {
            return this.GetType().Name;
       }
    }

答案 3 :(得分:0)

nameof的想法是使事物类型在运行时指定程序元素是安全的,但是使用编译时类型安全检查。

应该雾化想要显示的内容。例如,在我的错误消息中,我包含了类名和方法的相关信息,并且检查了它,因此,如果我更改任何名称,它们将被捕获为编译时错误:

class Operation
{
  public void Execute()
  { 
    try { ... }
    catch (Exception ex)
    {
    Console.Writeline($"{nameof(Operation)}.{nameof(Execute)} has encountered exception:{Environment.NewLine}{Environment.NewLine}{ex.Message}" );
    }
   }
}

<强>输出

Operation.Excecute has exception:
...

据说你应该覆盖ToString()并报告类名

public override string ToString() { return nameof(Self); } 

答案 4 :(得分:0)

在处理长类名时,我通常会为它创建一个内部常量:

private const string SomeConst = nameof(Self);

然后您可以在代码中使用它:

Console.WriteLine(SomeConst);