获取此实例名称

这可能吗!!?!?!?!?

我正在尝试创建一组模拟许多不同类型的东西的类。 这些东西的属性随着时间的推移而变化,我希望我的代码易于维护,所以我想做类似以下的事情:

public class Cat { public string CatName { get; set; } public Cat() { this.CatName = MAGICSTUFF.GetInstanceName(this); } } 

在其他地方,当我想要那些猫时,我希望能够说:

 [TestMethod] public void test_awesome_cats() { Cat Tiger = new Cat(); Assert.IsTrue(Tiger.CatName.Equals("Tiger")); } 

所以,我正在尝试将我的命名约定映射到对象属性中。 我无法弄清楚的部分是MAGICSTUFF.GetInstanceName。 那是一件事吗?

我怀疑这是不可能的,所以如果是这样的话,希望有人可以给我一些关于在这种情况下使用约定的聪明方法的其他想法。 我一直在考虑为Cat类使用属性一段时间,但我觉得如果它可能的话会更好。

这样的反思是不可能的。 编译器可以根据调试选项和范围擦除变量名称。 变量的名称是其“地址”的别名,因此无法撤消(至少在Java和C#AFAIK中)。

一个对象可以从nay变量指向,因此变量名称是无关紧要的,并且对象不知道这种东西:

 Cat tiger = new Cat(); Cat tiger2 = tiger; 

变量tiger2指向Cat “tiger”,因此2个变量指向具有不同名称的相同对象。

使用构造函数中传递的类属性。

执行此操作的常规方法是将“name”存储为实例中的变量,例如:

 // Initialize this like: var cat = new Cat("Tiger"); class Cat { public String Name { get; private set; } public Cat(String name) { Name = name; } } 

然后,如果您需要在多个地方获得老虎,请将其变为显式返回Tigers的方法:

 // This can go into a class of cat-creating static methods. Or maybe in the Cat class itself. public static Cat GiveMeATiger() { return new Cat("Tiger"); } 

鉴于这个问题,这样做是非常困难的,如果不是不可能的话。

使用调试符号,可以挖掘堆栈帧并枚举局部变量并将地址与实例地址匹配。 但是,该方法不起作用,因为构造函数将在引用设置之前被调用,因此当时tiger将为null并且匹配将一直失败。

然而,如果我可以改变这个问题,解决方案可能是你需要调用MAGICSTUFF.GetInstanceName(this); 而在CatName getter方法中,所以我的方法应该工作正常。

现在我正在尝试编写一些代码来执行此操作,但如果有人可能会阅读此内容并在我之前提出真正的实现,我会在此处发布。