Там много проблем с вашим кодом. Прежде всего:
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);
Вы пытались преобразовать его в T первым? Если 'NormalClass1.prop1' имеет тип или наследуется от' T', то просто преобразуйте его в 'T' явно. Если он не унаследован от 'T', вы, очевидно, не сможете этого сделать. –
Вы знаете только общий тип во время выполнения, поэтому вам нужны функции времени выполнения для создания общего типа. Здесь вы не можете использовать новое. Что-то вроде 'typeof (GenericClass <>). MakeGenericType (type1)' – Ralf
Извините, я вас неправильно понял. Ваш вопрос гораздо интереснее. Посмотрите на них: 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- пройти-в-а-родовую-методу –