2015-04-28 2 views
1

Ошибка при выдаче при попытке лить 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); 
    } 
} 

РЕДАКТИРОВАТЬ:

информации я не включал выше, является то, что объект является плагин Assemblly загружен из библиотеки DLL. Dll - ModelControls. Таким образом, TemplateClass действительно является ModelControls.TemplateClass и Derived1 и Derived2 предшествует одному и тому же пространству имен. Когда я использую Model.TemplateClass в typeof(). IsAssignable (t) не находит подходящих типов, даже если создание нового массива типа, подобного приведенному ниже, отлично работает.

Type[] types = { typeof(ModelControls.Derived1), typeof(ModelControls.Derived2) }; 
+0

Какой язык это? – Degustaf

+0

Извините - C# - это язык –

+1

Можете ли вы включить * точное сообщение об исключении? Если вы попытаетесь воспроизвести, определив эти классы и выполнив «(TemplateClass) Activator.CreateInstance (typeof (Derived2));', нет ошибки. Так что-то не так, как вы описываете. –

ответ

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); 
     } 
    } 
Смежные вопросы