尝试将Derived1和Derived2强制转换为TemplateControl类型对象时出现转换错误,以便我可以将它们添加到TemplateClass对象列表中。使用typeof(TemplateClass).IsAssignableFrom(t)与类型不匹配,即使它将t的基本类型显示为TemplateClass。
class abstract TemplateClass : UserControl {}
class Derived1 : TemplateClass {}
class Derived2 : TemplateClass {}
Type[] types = plugin.GetTypes(); //returning types for Derived1 and Derived2 correctly
foreach (Type t in types)
{
if (typeof(UserControl).IsAssignableFrom(t))
{
var control = (TemplateClass)Activator.CreateInstance(t); // casting error here
controls.Add(control);
}
}
编辑:
我上面没有包含的信息是对象插件是从dll加载的Assemblly。这个DLL是ModelControls。因此,TemplateClass实际上是ModelControls.TemplateClass,Derived1和Derived2前面有相同的命名空间。当我在typeof()。IsAssignable(t)中使用Model.TemplateClass时,它找不到任何匹配的类型,即使创建一个类似下面的新类型数组也能正常工作。
Type[] types = { typeof(ModelControls.Derived1), typeof(ModelControls.Derived2) };
答案 0 :(得分:2)
由于您正在检查typeof(UserControl)
并自动转换为TemplateClass
,因此您失败了。
如果t
是UserControl
会怎样?您将获得无效的强制转换异常。
这是检查typeof(TemplateClass)
:
Type[] types = { typeof(Derived1), typeof(Derived2) };
foreach (Type t in types)
{
if (typeof(TemplateClass).IsAssignableFrom(t)) // not typeof(UserControl)
{
var templateClass = (TemplateClass)Activator.CreateInstance(t);
}
}