将属性的类型传递给泛型类型
本文关键字:泛型类型 类型 属性 | 更新日期: 2023-09-27 17:50:42
我有一个generic class
GenericClass<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
您的代码有多个问题。首先:
var type1 = typeof(NormalClass1).GetProperty("prop1").GetType();
将返回PropertyInfo类型,而不是属性的类型。你想要的是:
var type1 = typeof(NormalClass1).GetProperty("prop1").PropertyType;
其次,你似乎对泛型、类型和类型参数有概念上的问题。
基本上,类型变量(Type x = typeof(NormalClass1<>
)和泛型类型参数(NormalClass<T>
中的T)之间是有区别的。T只不过是Type的占位符。您可以使用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将替代object instance。必须这样做,因为您可以检查编译时的类型。最佳实践可能是为泛型类创建一个非泛型基类。您可以使用基类类型,并在运行时至少进行少量类型检查,即使您没有机会测试泛型类型参数。应该是这样的:
var instance = (GenericClassBase)Activator.CreateInstance(genericType);
您只能使用Reflection:
var generic = typeof (GenericClass<T>).MakeGenericType(type1);
var instance = Activator.CreateInstance(generic);