Я пытаюсь обернуть голову вокруг отражения, поэтому я решил добавить возможности плагина к программе, которую я пишу. Единственный способ понять концепцию - замалчивать ваши пальцы и писать код, поэтому я пошел по пути создания простой библиотеки интерфейса, состоящей из интерфейсов IPlugin и IHost, библиотеки реализации плагинов классов, реализующих IPlugin, и простой который создает экземпляр класса реализации IHost, который выполняет простую работу с объектами плагина.
Используя отражение, я хотел повторить типы, содержащиеся в моей DLL-реализации плагина, и создать экземпляры типов. Я смог успешно создать классы с этим кодом, но я не мог отбросить созданный объект к интерфейсу.
Я пробовал этот код, но я не мог бросить объект o, как я ожидал. Я прошел через процесс с помощью отладчика и был вызван правильный конструктор. Объект Quickwatching o показал мне, что он имеет поля и свойства, которые я ожидал увидеть в классе реализации.
loop through assemblies
loop through types in assembly
// Filter out unwanted types
if (!type.IsClass || type.IsNotPublic || type.IsAbstract )
continue;
// This successfully created the right object
object o = Activator.CreateInstance(type);
// This threw an Invalid Cast Exception or returned null for an "as" cast
// even though the object implemented IPlugin
IPlugin i = (IPlugin) o;
Я сделал код с этим.
using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();
Вот мои вопросы:
- Activator.CreateInstance(Тип t) возвращает объект, но я не мог передать объект интерфейсу, который реализовал объект. Почему?
- Должен ли я использовать другую перегрузку CreateInstance()?
- Каковы подсказки и трюки, связанные с размышлениями?
- Есть ли какая-то важная часть отражения, которую я просто не получаю?