我有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
如何将此类型传递给 //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
}
}
答案 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,Types和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);