3

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

例如:

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 { }

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

编辑:对不起,我对我到底想要做什么的错误解释。我正在寻找一种存储类型并确保此类型继承父级的方法。我想要类型安全并确保商店类型是父级的子级。就目前而言,唯一的方法是创建我自己的 IDictionary 实现,如下所示。但这并不是我真正想要的。我想这样做

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

任何的想法?

4

4 回答 4

7

我认为您只是想Dictionary<string, Type>在添加您应该做的事情时使用 then;

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

编辑:如 Avi 的回答中所述GetType(),如果您想在运行时添加类型,则可以在实例上使用该方法。如果你是在编译时做的,你通常会typeof在类上使用。

于 2013-06-20T17:27:59.967 回答
2

使用类型:

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

或者如果您有一个实例:

dict["key1"] = instance.GetType();
于 2013-06-20T17:30:10.317 回答
1

要解决您的问题,您需要检查System.Reflection您的类型是否从类继承Parent。检查此答案以获取更多信息(链接)。

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

或者这个(链接

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++;
}

我认为这个问题没有“直接”的解决方案。

于 2013-06-20T17:28:14.833 回答
0
var dict = new Dictionary<String, Type>;
dict["key1"] = typeof(Child1);
于 2013-06-20T17:28:06.257 回答