我想使用以下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
对象。
答案 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)
答案 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);