C#获取类实例名称

时间:2017-03-05 13:43:51

标签: c# class

我想要定义的类实例的名称

例如我有这段代码:

MyClass hello = new MyClass();

MyClass我有一个方法:

MyClass{
    private string _name;
    .
    .
    public string getName(){
        return ...//THIS SHOULD RETURN 'hello'
    }
}

这可能吗?

1 个答案:

答案 0 :(得分:-3)

除了以下情况之外,这是不可能的:

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

最简单的方法是使用nameof(如另一个答案中所示):

var varName = new MyClass();
return nameof(varName); // will return "varName"

最棒的是这将编译时转换为"varName",这样你就可以获得编译时检查但静态字符串的运行速度。

方法的消解

另一种方法是将方法分解并将其转换为lambda experssion。在这个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;
    }
}

classname(不是变量名!)

要获得更方便的东西,就是获得班级的名称。你可以通过以下方式做到这一点:

nameof

return nameof(MyClass); //will compile to "MyClass"

因此,编译时你可以使用MyClass检查类型和轻松重构。但运行时它总会返回“MyClass'。

反射

return this.GetType().Name;

将返回返回此类的名称。与nameof相比,这并不总是返回' MyClass',但实际上返回实例的reall类。例如,当您拥有子类MySubClass时,这将返回MySubclass