Тип интерфейса отражения C # и Unity - PullRequest
0 голосов
/ 19 сентября 2018

надеюсь, кто-то может помочь.Я использую Unity и app.config для динамической загрузки и запуска методов в определенных сборках.В нашем основном приложении я делал что-то вроде ...

var ourProcess = container.Resolve<IProcessing>(new ResolverOverride[] { new ParameterOverride("parameter1", value1) });
ourProcess.ExecuteProcess(parameterValues); 
// parameterValues a string list, all of my processes use this main calling mechanism.
// there are many other interfaces i a number of other assemblies along with IProcessing

Однако в основном приложении мне нужна ссылка на интерфейс IP-обработки, и это бесполезно, потому что, если я добавлю другую сборку обработки, я не будуЯ не хочу ссылаться на указанную новую сборку в основном приложении, перестраивать, повторно тестировать и распространять, я просто хочу, чтобы Unity разрешал и вызывал по мере необходимости.

Я пытался использовать отражение по типу ...

Assembly asm = Assembly.LoadFrom("CompName.Application.Processing.dll");
foreach (Type type in asm.GetTypes())
{
    if (type.GetInterface("IProcessing") != null)
    {
        var ourProcess = container.Resolve<type> (new ResolverOverride[] { new ParameterOverride("parameter1", value1) });
        oSummary = ourProcess.ExecuteProcess(parameterValues);
    }
}
// at runtime we will know the strings "CompName.Application.Processing.dll" and "IProcessing"

Однако во время компиляции мы получаем, что «тип» является переменной, но используется как тип », достаточно справедливо.

Я пробовал typeof (type), type.GetType() и Тип (тип) безрезультатно, что приводит к различным ошибкам компилятора.

Итак, вопрос в том, как использовать строковое имя интерфейса, который требуется для создания экземпляра и запуска процесса в-связанная сборка разрешена и загружена Unity?Я немного новичок в Unity, и это первый раз, когда я использую рефлексию, поэтому, пожалуйста, будьте осторожны со мной.Однако я чувствую, что это должно быть относительно легко, и чувствую, что упускаю что-то фундаментальное.

Я искал предыдущие несколько часов и пробовал одну или две вещи, но ни одна не дала мне результаты, которые мне нужны.Удаление кода, управляемого Unity, во всех системах может занять много времени.

Любой вклад приветствуется, спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

Если у вас уже есть тип класса, вы можете просто использовать

var processor = Activator.CreateInstance(type, param[] object args) as IProcessing;

Edit: или вы можете использовать «динамический», если вы готовы пойти на снижение производительности, идущее с этим.И если вы согласны с тем фактом, что вам не понадобится помощь Intellisense во время написания кода.

var processor = Activator.CreateInstance(type, param[] object args) as dynamic;
processor.ExecuteProcess(parameterValues);
...