2010-12-01 4 views
3

У меня есть следующий код:Reflection для создания экземпляра класса в DLL

var type = typeof(PluginInterface.iMBDDXPluginInterface); 
var types = AppDomain.CurrentDomain.GetAssemblies().ToList() 
    .SelectMany(s => s.GetTypes()) 
    .Where(p => type.IsAssignableFrom(p)); 

Type t = types.ElementAt(0); 
PluginInterface.iMBDDXPluginInterface instance = Activator.CreateInstance(t) as PluginInterface.iMBDDXPluginInterface; 
TabPage tp = new TabPage(); 

tp = instance.pluginTabPage(); 

Класс в библиотеке DLL реализует PluginInterface и тип в приведенном выше коде, это определенно правильный класс/тип, однако, когда я пытаюсь создать экземпляр через интерфейс, я получаю сообщение об ошибке:

Ссылка на объект не присваивается экземпляру объекта.

Кто-нибудь знает почему?

Спасибо.

+3

На какой строке вы получаете это исключение? – decyclone 2010-12-01 13:16:09

+0

Я получаю его, когда вызываю метод instance.pluginTabPage. – 2010-12-01 13:18:24

+2

Вам нужно лучшее сообщение об ошибке - измените свой `Activator.CreateInstance (t) как плагин ...` to `(плагин ...) Activator.CreateInstance (t)` – 2010-12-01 13:23:36

ответ

3

Во всяком случае

TabPage tp = new TabPage(); 
tp = instance.pluginTabPage(); 

не имеет никакого смысла.

Do:

TabPage tp = instance.pluginTabPage(); 

сделать Также в следующем:

Type type = AppDomain.CurrentDomain.GetAssemblies() 
    .SelectMany(s => s.GetTypes()) 
    .FirstOrDefault(p => type.IsAssignableFrom(p)); 
if (type != null) 
{ 
    // create instance 
} 

или (мой предпочтительный способ):

from asm in AppDomain.CurrentDomain.GetAssemblies() 
from type in asm.GetTypes() 
where !type.IsInterface && !type.IsAbstract && typeof(ITarget).IsAssignableFrom(type) 
select (ITarget)Activator.CreateInstance(type); 
1

Попробуйте взглянуть на тип отражателя. Может быть, конструктор принимает аргументы, что вы неправильно переходите к Activator.CreateInstance.

Смежные вопросы