C#: приведение к типу Generic <a, b>

140
19 декабря 2018, 17:30

Ситуация:

Имеются названия двух типов в виде строки:

    string nameTypeInput = activityNamespace + "." + className;
    string nameTypeOutput = activityNamespace + "." + (className.Replace("Request","Response"));
    Type typeInput = Type.GetType(nameTypeInput);
    Type typeOutput = Type.GetType(nameTypeOutput);

Требуется приветси объект result к типу ActivityClass< typeInput, typeOutput>

С этим трудности.

если написать:

var rsp = (ActivityClass<typeInput, typeOutput>)request;

то получим ошибку: 'typeOutput' is a variable but is used like a type

Как правильно сделать приведение типов?

Спасибо

Смысл приведения:

Класс request создается рефлексиией и по факту может имет любой тип (classA, classB, classC), но все эти типы - наследуютс от одного базового ActivityClass<input, output>.

В этом классе есть метод "Execute()"

Соотвественно, класс request приводится ActivityClass<input, output> чтобы на выходе сегда получать один объект и выполнить его с помощью "Execute()". Это избавит от последующего определения типа и позволить просто выводить результат выполнения метода.

Answer 1

Никак. Если тип неизвестен на этапе компиляции - то вы не можете объявить переменную этого типа.

Лучше всего будет оставить переменную result как есть и ничего с ней не делать: объект внутри нее уже имеет нужный вам тип, а большего добиться и не получится.

Но если в таком виде ваша задача не решается, можно сделать следующее:

  1. Ввести необобщенный интерфейс, который реализовать в вашем ActivityClass - это позволит использовать этот интерфейс для типизации переменной:

    var rsp = (IActivityClass)result;
    
  2. Если вам зачем-то нужен сам тип ActivityClass< typeInput, typeOutput> - его можно получить через MakeGenericType:

    var resultType = typeof(ActivityClass<,>).MakeGenericType(typeInput, typeOutput);
    

    или узнать непосредственно у объекта:

    var resultType = result.GetType();
    
  3. Можно объявить обобщенный метод и вызвать его через рефлексию:

    static void Bar<TIn, TOut>(ActivityClass<TIn, TOut> result) { ... }
    var method = typeof(Foo).GetMethod("Bar", BindingFlags.Static | BindingFlags.NonPublic);
    method.MakeGenericMethod(typeInput, typeOutput).Invoke(null, new object[] { result });
    
READ ALSO
Клик на SubMenuItem в контекстном меню

Клик на SubMenuItem в контекстном меню

У меня есть дата грид и в ресурсах к ней определено контекстное менюОно статичное, но мне нужно динамично добавлять sub MenuItem для одного из айтемов...

154
Библиотека для чтения shapefile shp shx. C#

Библиотека для чтения shapefile shp shx. C#

Всем доброго времени суток!

145
Вывести категории и товары на одной странице

Вывести категории и товары на одной странице

Мне нужно вывести категории и товары на одной странице, как здесь - http://bavariabavaria-rest

201