2011-08-19 66 views
5

我被C#错误轻微混淆。C#类型或命名空间预期混淆

Type t = thing.GetType()

t现在是一个类型。但是,如果我试图做到这一点:

new GenericThing<t>

我得到一个警告说,预计类型或命名空间。我错过了什么?

回答

2

t是在运行时创建的Type对象。泛型期望类型名称,在编译时解析。要创建一个通用的在运行时,你必须使用MakeGenericType

例如:

Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t)); 
2

tType类型的对象实例,即东西,只存在于运行。泛型在编译时工作,并期望类型的名称。

我想你同意以下无厘头:

Type t = thing.GetType() 
TypeOfThing instance = new t(); 

而出于同样的原因,你不能传递一个类型实例作为通用的参数。

1

Type是一类代表一个类型,而不是实际之一,所以你不能在预期的类型或类型参数的场所使用的Type一个实例。

0

你应该做这样的事情:

var youGeneric = typeof(GenericThing<>).MakeGenericType(t) 
             .GetConstructor(Type.EmptyTypes) 
             .Invoke(null); 
相关问题