2015-05-26 5 views
1

У меня есть generic classGenericClass<T> по какой-то причине мне нужно передать общий тип от другого типа, например, что:прохождение типа собственности общего типа

говорит, у меня есть некоторые classes от NormalClass1 до NormalClassN всех они имеют свойство говорят prop1 с различными types мне нужно сделать, это

var type1 = typeof(NormalClass1).GetProperty("prop1").GetType(); 

и отправить type1 на новый экземпляр GenericClass подобное:

var instance = new GenericClass<type1>(); 

но произошла ошибка, которая говорит, что

Cannot implicitly convert type 'GenericClass<type1>' to 'GenericClass<T>' 

, как я могу передать этот тип GenericClass

+0

Вы пытались преобразовать его в T первым? Если 'NormalClass1.prop1' имеет тип или наследуется от' T', то просто преобразуйте его в 'T' явно. Если он не унаследован от 'T', вы, очевидно, не сможете этого сделать. –

+0

Вы знаете только общий тип во время выполнения, поэтому вам нужны функции времени выполнения для создания общего типа. Здесь вы не можете использовать новое. Что-то вроде 'typeof (GenericClass <>). MakeGenericType (type1)' – Ralf

+1

Извините, я вас неправильно понял. Ваш вопрос гораздо интереснее. Посмотрите на них: http://stackoverflow.com/questions/6562685/pass-type-to-generic-method-nested-generic http://stackoverflow.com/questions/232535 ​​/ how-to-use-reflection-to-call-generic-method http://stackoverflow.com/questions/9666064/c-sharp-get-type-parameter-at-runtime-to- пройти-в-а-родовую-методу –

ответ

1

Там много проблем с вашим кодом. Прежде всего:

var type1 = typeof(NormalClass1).GetProperty("prop1").GetType(); 

возвращает тип PropertyInfo, а не тип собственности. Чего вы хотите:

var type1 = typeof(NormalClass1).GetProperty("prop1").PropertyType; 

Во-вторых вы, кажется, концептуальную проблему с обобщениями, типы и TypeParameters.

В принципе существует разница между переменной типа (Type x = typeof(NormalClass1<>) и общим параметром типа (T в NormalClass<T>). T - не более чем заполнитель для Типа. Вы можете использовать typeof(T), чтобы получить фактический тип T. С другой стороны, использование typeof(x) приведет к ошибке вычисления, так как x является переменной, а не типом. Вместо этого вы использовали бы x.GetType().

Вы не можете создать общий тип через переменную типа времени выполнения напрямую. Вместо этого вы можете создать общий тип через отражение.

Следующий пример должен показать, как это сделать

var genericTypeParameter = typeof(NormalClass1).GetProperty("prop1").PropertyType; 
var genericBaseType = typeof(GenericClass<>); 
var genericType = genericBaseType.MakeGenericType(genericTypeParameter); 
var instance = Activator.CreateInstance(genericType); 

Как вы можете видеть, экземпляр вар будет заменить на экземпляр объекта. Это должно быть так, так как вы можете проверить тип времени компиляции. Лучшей практикой, вероятно, было бы создание не общего базового класса для вашего общего класса. Вы можете использовать тип базового класса и иметь хотя бы небольшую проверку типов во время выполнения, даже если у вас нет возможности проверить параметр типового типа.

Это было бы то, что это будет выглядеть так:

var instance = (GenericClassBase)Activator.CreateInstance(genericType); 
1

Вы можете сделать это только с отражением:

var generic = typeof (GenericClass<T>).MakeGenericType(type1); 
    var instance = Activator.CreateInstance(generic); 
Смежные вопросы