从派生类到基类

时间:2015-04-28 15:47:41

标签: c# casting

尝试将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) };

1 个答案:

答案 0 :(得分:2)

由于您正在检查typeof(UserControl)并自动转换为TemplateClass,因此您失败了。

如果tUserControl会怎样?您将获得无效的强制转换异常。

这是检查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);
        }
    }