Ситуация:
Имеются названия двух типов в виде строки:
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()".
Это избавит от последующего определения типа и позволить просто выводить результат выполнения метода.
Никак. Если тип неизвестен на этапе компиляции - то вы не можете объявить переменную этого типа.
Лучше всего будет оставить переменную result как есть и ничего с ней не делать: объект внутри нее уже имеет нужный вам тип, а большего добиться и не получится.
Но если в таком виде ваша задача не решается, можно сделать следующее:
Ввести необобщенный интерфейс, который реализовать в вашем ActivityClass - это позволит использовать этот интерфейс для типизации переменной:
var rsp = (IActivityClass)result;
Если вам зачем-то нужен сам тип ActivityClass< typeInput, typeOutput> - его можно получить через MakeGenericType:
var resultType = typeof(ActivityClass<,>).MakeGenericType(typeInput, typeOutput);
или узнать непосредственно у объекта:
var resultType = result.GetType();
Можно объявить обобщенный метод и вызвать его через рефлексию:
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 });
Сборка персонального компьютера от Artline: умный выбор для современных пользователей