Использование отражения для создания экземпляра класса в DLL - PullRequest
3 голосов
/ 01 декабря 2010

У меня есть следующий код:

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 и тип в приведенном выше коде, определенно является правильным классом / типом, однако, когда я пытаюсь создать экземпляр через интерфейс, я получаю сообщение об ошибке:

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

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

В любом случае

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 голос
/ 01 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...