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

时间:2015-05-26 08:42:44

标签: c# generics

我有generic class GenericClass<T> 出于某种原因,我需要从另一种类型传递泛型类型:

说我classesNormalClass1有一些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

如何将此类型传递给 //number of rows int rowNum = GridView1.Rows.Count; //go through each row for (int i = 0; i < rowNum; i++) { //get the cell text string corr= GridView1.Rows[0].Cells[0].ToString(); //set color based on the text in the cell if (corr == "Correct") { GridView1.SelectRow(i); GridView1.SelectedRow.ForeColor = Color.Black; GridView1.SelectedRow.BackColor = Color.Cyan; } else { //do watever } }

2 个答案:

答案 0 :(得分:1)

您只能使用反射:

    var generic = typeof (GenericClass<T>).MakeGenericType(type1);
    var instance = Activator.CreateInstance(generic);

答案 1 :(得分:1)

您的代码存在多个问题。 首先:

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

将返回类型PropertyInfo,而不是属性的类型。你想要的是:

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

其次,您似乎对Generics,T​​ypes和TypeParameters存在概念性问题。

基本上,Type变量(Type x = typeof(NormalClass1<>)和泛型Type参数(NormalClass<T>中的T)之间存在差异。 T不仅仅是Type的占位符。您可以使用typeof(T)获取T的实际类型。另一方面,使用typeof(x)会导致计算错误,因为x是变量而不是Type。您可以使用x.GetType()代替。

您无法直接通过运行时类型变量创建泛型类型。 你可以做的是通过反射创建泛型类型。

以下示例应说明如何执行此操作

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

如您所见,var实例将替换为对象实例。必须这样,因为您可以检查编译时间的类型。最佳实践可能是为您的泛型类创建非泛型基类。您可以使用基类类型,并且在运行时至少进行少量类型检查,即使您没有机会测试泛型类型参数也是如此。

这将是它的样子:

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