繁体   English   中英

从派生类到基类的转换错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM