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

本文关键字:存储 子类 类型 Dictionary 何创建 创建 | 更新日期: 2023-09-27 18:19:27

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

例如:

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实现。但这并不是我想要的。我想做这个

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

知道吗?

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

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

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

编辑:正如Avi的回答中所指出的,如果您想在运行时添加Type,则可以在实例上使用GetType()方法。如果您在编译时执行此操作,通常会在类上使用typeof

使用类型:

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

或者如果你有一个例子:

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

要解决问题,您需要通过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++;
}

我认为这个问题没有"直接"的解决办法。

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