【问题标题】:Dictionary that takes a type and a stack接受类型和堆栈的字典
【发布时间】:2013-12-09 00:52:45
【问题描述】:

我想制作一个具有类和堆栈类型的字典。类的类型将是字典的键。

private Dictionary<typeof(Enemy), Stack> d;

当然,上面的行不会编译。


涉及的敌人类别:

public abstract Enemy : MonoBehaviour {}

public class A : Enemy {}

public class B : Enemy {}

我正在建立上一个问题:Dictionary to Stack Class Types Together (除非您真的想阅读,否则无需阅读)。

那么如何使用我的类类型作为字典中的键呢? 我宁愿不使用字符串名称或枚举。

字典在内存中应该是这样的:

[A] --> stack[]
[B] --> stack[]

也就是说,每种敌人类型都有一个堆栈。

【问题讨论】:

    标签: c# dictionary types unity3d


    【解决方案1】:

    你想定义一些字典吗

    <K,V> 
    

    其中 K 是 Enemy 的子类的任何对象? 或者...其中 K 是 Enemy 子类的任何类型?

    我自己也想过好几次。

    所以...我不太熟悉 最新的 C# 语言功能。 我可能只是将其定义为

    <Type, V> 
    

    然后当东西被添加到这个结构中时,我自己检查一下 tp 添加的类型实际上是 IsSubclassOf 的 Enemy 类型,如果不是 我会抛出一个异常。

    但可能有更好的方法使用 最新的 C# 语言功能。

    【讨论】:

    • 这里的key是Enemy子类的类型。
    【解决方案2】:

    您是否正在寻找类似的东西:

    var dictionary = new Dictionary<Type,Stack>();
    

    用法如下:

    dictionary.Add(typeof(A),new Stack());
    dictionary.Add(typeof(B),new Stack());
    
    dictionary[typeof(A)].Push(new Object());
    var objectFromStackOfA = dictionary[typeof(A)].Pop();
    

    【讨论】:

    • Type 不会编译。我明白了:“找不到类型或命名空间名称‘Type’”
    • @Mike John,添加using System;
    • 这有帮助。它完美地工作。在您的答案中包括推送和弹出。他们看起来像这样[enemy.GetType()],我肯定会接受你的回答(这样其他人以后可以学习)。
    【解决方案3】:

    简单的解决方案是使用字符串作为类的类型:
    覆盖类的 ToString() 方法,然后使用它添加到字典中!

    public class Enemy { }
    public class A : Enemy
    {
        public override string ToString()
        {
             return "A";
        }
    }
    public class B : Enemy
    {
        public override string ToString()
        {
            return "B";
        }
    }
    public class Stack { }
    
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, Stack> d = new Dictionary<string, Stack>();
            A obj1 = new A();
            A obj2 = new A();
            B obj3 = new B();
            B obj4 = new B();
            d.Add(obj1.ToString(), new Stack());
            d.Add(obj2.ToString(), new Stack());
            d.Add(obj3.ToString(), new Stack());
            d.Add(obj4.ToString(), new Stack());
        }
    }
    

    【讨论】:

    • 你说简单好用的String。使用 String 而不是 Type 有什么好处吗?也许它更快?
    • 我不知道!我更喜欢这个,因为字典有一个字符串键很直观。
    • 我的猜测是,您每次想要推送或弹出时都会为创建该字符串付出代价。这可能是一个值得在 StackOverflow 中提出的单独问题。
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2011-03-04
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多