如何创建一个字典来存储继承另一个类的值作为值?
例如:
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 = ...
有什么想法吗?
答案 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);