如何创建Dictionary来存储子类的类型

时间:2013-06-20 17:25:39

标签: c# inheritance dictionary

如何创建一个字典来存储继承另一个类的值作为值?

例如:

Dictionary<String, typeof(Parent)> dict = new Dictionary<string, typeof(Parent)>();
dict["key1"] = typeof(Child1);
dict["key2"] = typeof(Child2);
dict["key3"] = typeof(Child3);

public abstract class Parent { }

public class Child1 : Parent { }
public class Child2 : Parent { }
public class Child3 : Parent { }

我不想存储实例,而是存储类类型。

编辑:对于我对我想要做的事情的错误解释感到抱歉。我正在寻找一种存储类型的方法,并确保此类型继承父类。我希望是类型安全的,并确保商店类型是Parent的子类。目前唯一的方法是,我认为如何创建自己的IDictionary实现为here。但这不是我想要的。我想这样做

Dictionary<string, typeof(Parent)> dict = ...

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

我认为你只想使用Dictionary<string, Type>然后添加你应该做的事情;

dict.Add("key1", typeof(Child1));

编辑:如Avi的回答所述,如果要在运行时添加Type,可以在实例上使用GetType()方法。如果您在编译时这样做,通常会在课程上使用typeof

答案 1 :(得分:2)

使用typeof:

dict["key1"] = typeof(Child1);

或者如果你有一个实例:

dict["key1"] = instance.GetType();

答案 2 :(得分:1)

要解决您的问题,您需要通过System.Reflection检查您的类型是否继承自Parent类。请查看此答案以获取更多信息(link)。

if (typeof(Parent).IsAssignableFrom(typeof(Child1)))
{
    dict["key1"] = typeof(Child1);
}

或这一个(link

int n = 0;
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
foreach (Type type in types)
{
    if (type.IsSubclassOf(typeof(Parent)))
    {
         dict["key" + n] = type;
         n++;
    }
}

修改

提供替代解决方案......

var result = System.Reflection.Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(t => t.IsSubclassOf(typeof(Parent));

foreach(Type type in result)
{
    dict["key" + n] = type;
    n++;
}

我认为没有&#39;直接&#39;解决这个问题。

答案 3 :(得分:0)

var dict = new Dictionary<String, Type>;
dict["key1"] = typeof(Child1);