获取此实例名称

问题描述 投票:2回答:4

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

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

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

c#
4个回答
2
投票

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

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

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

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

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


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

1
投票

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

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

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

现在我正在尝试编写一些代码来做到这一点,虽然我会在这里发布,如果有人可能会阅读这个并在我面前提出真正的实现。


-1
投票

我知道,我知道,老帖子。

但我找到了解决方案......

public static List<Packet> Packets = new List<Packet>();
public class Packet
{
    public Packet()
    {
        Packets.Add(this);
    }
    public string packetName;
}

public Packet myPacket = new Packet();
myPacket.packetName = "myPacket";

public void SomeMethod()
{
    int x = 0;
    foreach (Packet p in Packets)
    {
        if (p.packetName = "myPacket")
        {
            Packet myPacket = Packets[x];
            break;
        }
        x++;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.