获取此实例名称

时间:2011-09-10 02:47:11

标签: c#

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

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

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类使用属性一段时间,但我觉得如果它可能的话会更好。

4 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:2)

正常的做法是将'name'存储为实例中的变量,例如:

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

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

// 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");
}

答案 2 :(得分:1)

考虑到问题,这样做是非常困难的,如果不是不可能的话。

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

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

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

答案 3 :(得分:-1)

我知道,我知道,以前的帖子。

但是我找到了解决方法...

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>