2013-11-24 2 views
0

Я хочу сделать словарь, который имеет тип класса и стек. Тип класса будет ключом для словаря.Словарь, который берет тип и стек

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[] 

То есть, каждый тип Враг получает стек.

ответ

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(); 
+0

Запись 'Type' не компилируется. Я получаю следующее: «Тип или имя пространства имен« Тип »не найдено» –

+0

@ Майк Джон, добавьте 'using System;' – GrzegorzM

+0

Это помогло. Он работает отлично. Включите в свой ответ толчок и поп. Они выглядят примерно так: '[enemy.GetType()]', и я обязательно приму свой ответ (так узнают другие люди позже). –

0

Вы пытаетесь определить некоторый словарь

<K,V> 

где K является любым объектом класса, который является подклассом Enemy? Или ... где K - любой тип, который подклассы Enemy?

Я думал об этом сам в нескольких случаях.

Итак ... Я не совсем хорошо знаком с новейшими функциями языка C# . я бы, наверное, просто определить его как

<Type, V> 

затем вещи будут добавлены к этой структуре сделать проверить себя, если тип ф добавлен фактически IsSubclassOf типа врага, и если не я бы бросить исключение.

Но может быть лучший способ использовать новейшие функции языка C#.

+0

В случае, если ключ является типом подкласса Врага. –

0

Простое решение заключается в использовании строки как тип вашего класса:
переопределять значение 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()); 
    } 
} 
+0

Вы говорите, что просто использовать String. Есть ли преимущество в использовании String над типом? Возможно, это быстрее? –

+0

Я не знаю! Я предпочитаю это, потому что интуитивно понятно, что словарь имеет строковый ключ. – Shamim

+1

Я предполагаю, что вы платите цену за создание этой строки каждый раз, когда хотите нажать или поп. Это может быть отдельный вопрос, который стоит задать здесь в StackOverflow. –

Смежные вопросы