将属性的类型传递给泛型类型

本文关键字:泛型类型 类型 属性 | 更新日期: 2023-09-27 17:50:42

我有一个generic class GenericClass<T>由于某种原因,我需要从另一个类型传递泛型类型,就像这样:

假设我有一些classes,从NormalClass1NormalClassN,它们都有属性,比如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);