Общие плагины - PullRequest
       1

Общие плагины

1 голос
/ 26 сентября 2011

Привет, я пишу несколько плагинов

это выглядит так

public class Person
{
public string Name;
public string Surname;
}

public interface IWork
{
Type GetType {get;} 
}

public interface IWorker<T> : IWork
{
 T GetSingle();
 T[] GetMultiple();
 void DoWork(T object);
}

один плагин выглядит так

public PersonPlugin : IWroker<Person>
{
//implementation of interface
//return typeof(Person);
}

А теперь вопрос, как я могу динамически создать экземпляр для примера IWork? Как разыграть IWork, если у меня есть только Type, это возможно?

я хочу сделать (должен быть динамическим, для всех экземпляров плагинов)

IWork<T> iWorkInstalce = (IWork<T>)Activator.CreateInstance(typeof(PersonPlugin));

или

IWork iWorkInstalce = (IWork)Activator.CreateInstance(typeof(PersonPlugin));
IWork<Person> personInstance = (CAST) typeof(IWork<>).MakeGenericType(iWorkInstance.Type);

1 Ответ

0 голосов
/ 05 мая 2012

Вы не можете привести к IWorker<T>, не указав, что такое T. Если вы сделаете это, ваш первый пример верен:

IWorker<Person> iWorkInstalce = (IWorker<Person>)Activator.CreateInstance(typeof(PersonPlugin));

Можно использовать отражение в классе PersonPlugin, чтобы найти его реализацию IWorker<T>, а затем выяснить, что такое T, но это только любое использование в качестве среды выполнения, оно вам вообще не поможет в коде.

Если вы знаете, что вы ожидаете от T, укажите это явно. В противном случае, вместо этого приведите не универсальный IWork и передайте ему версии ваших методов, которые возвращают Object. Если вы не знаете, что такое T во время компиляции, наличие общего IWorker<T> не может вам здесь помочь.

Если вашему приложению нужно знать, с каким типом работает ваш плагин во время выполнения, оно может вызвать свойство GetType.

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