[英]Casting Error from Derived Class to Base Class
尝试将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加载的。 dll是ModelControls。 所以TemplateClass实际上是ModelControls.TemplateClass以及Derived1和Derived2都带有相同的命名空间。 当我在typeof()。IsAssignable(t)中使用Model.TemplateClass时,即使创建如下所示的新类型数组,它也找不到任何匹配的类型。
Type[] types = { typeof(ModelControls.Derived1), typeof(ModelControls.Derived2) };
您失败了,因为您正在检查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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.