这是不可能的,除了:
MyClass hello = new MyClass();
string name = nameof(hello)
或
MyClass hello = new MyClass(nameof(hello));
class MyClass {
private string Name;
public MyClass(string name){
this.Name = name;
}
public string getName(){
return this.Name;
}
}
但这会导致这样的问题:
MyClass hello = new MyClass(nameof(hello));
test = hello;
test.getName(); // returns: hello;
取决于您到底想要什么,我建议改为:
变量名
名称
最简单的方法是使用 nameof(如另一个答案所示):
var varName = new MyClass();
return nameof(varName); // will return "varName"
很棒的是这会将编译时间转换为"varName",因此您具有编译时间检查和静态字符串运行速度的优势。
方法剖析
另一种方法是剖析该方法并将其转换为 lambda 表达式。在这个 lambda experssion 中,您可以使用此类的构造来搜索新的变量声明。然后获取此变量的名称。很抱歉,但我没有太多经验可以向您展示这方面的示例。我希望您参考一个重复的帖子:Getting names of local variables (and parameters) at run-time through lambda expressions
我不确定你为什么要这样做。因为这是关于您的代码如何命名/编程的,这在运行时并不重要。 (那么它只关心它的行为方式。)
我建议您为 roslyn 编译器创建一个代码分析器,并将其添加到您的项目中。
建筑解决方案
获得所描述行为的唯一方法是在构造函数中将变量名称赋予类:
var myVar = new MyClass(nameof(myVar));
var var2 = myVar;
var2.GetName(); // returns "myVar"
public class MyClass {
public MyClass(name){
this.createdWithName = name;
}
public string GetName(){
return this.createdWithName;
}
}
类名(不是变量名!)
想要更方便的事情是获取类的名称。您可以通过以下方式做到这一点:
名称
return nameof(MyClass); //will compile to "MyClass"
因此,在编译时,您可以使用 MyClass 检查类型和轻松重构。但运行时它总是会返回“MyClass”。
反射
return this.GetType().Name;
将返回返回这个类的名称。与 nameof 相比,这并不总是返回“MyClass”,而是实际上返回实例的真实类。例如,当您有子类 MySubClass 时,这将返回 MySubclass。