【问题标题】:C# Get Class Instance Name [duplicate]C#获取类实例名称[重复]
【发布时间】:2017-03-05 13:43:51
【问题描述】:

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

例如我有这个代码:

MyClass hello = new MyClass();

MyClass 我有一个方法:

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

这样可以吗?

【问题讨论】:

  • 不,hello属于父方法,不会传递给类构造函数。
  • 据我所知,这在 C# 中是不可能的。你想达到什么目的?
  • 如果我这样做MyClass hello = new MyClass(); MyClass bye = hello - 那么它应该返回什么?
  • 只想指出没有“已定义类实例的名称”之类的东西。许多不同名称的变量可以指向同一个实例。
  • 这听起来不像 C# 中的好设计。如果你需要这个类来保存设置,我最好按照你的建议将设置的名称传递给它的构造函数。 @Evk 是对的,如果你将类存储在一个集合中,例如它应该返回什么?

标签: c# class


【解决方案1】:

这是不可能的,除了:

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

【讨论】:

  • GetType().Name 返回类型名称,而不是实例名称。
  • @TiagoFreitasLeal 请阅读我的全部答案!前 3 个标题清楚地说明了获取变量名称的 3 种方法。没有实例名称(仅当您有名为 Name 的属性时),只有变量名称!
  • 后面是正确的答案:“没有实例名(只有当你有名为Name的属性时),只有变量名!”所以正确的问题是“如何获取变量名字”,答案是肯定的stackoverflow.com/questions/9801624/…
  • 这无助于从类中获取实例名称。
  • @SohamDasgupta 我提供了 c# 中可能的选项。这在 c# 中是不可能的,我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 2019-01-13
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
相关资源
最近更新 更多