Ситуация:
Имеются названия двух типов в виде строки:
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 });
У меня есть дата грид и в ресурсах к ней определено контекстное менюОно статичное, но мне нужно динамично добавлять sub MenuItem для одного из айтемов...
Мне нужно вывести категории и товары на одной странице, как здесь - http://bavariabavaria-rest