我被C#错误轻微混淆。C#类型或命名空间预期混淆
Type t = thing.GetType()
t
现在是一个类型。但是,如果我试图做到这一点:
new GenericThing<t>
我得到一个警告说,预计类型或命名空间。我错过了什么?
我被C#错误轻微混淆。C#类型或命名空间预期混淆
Type t = thing.GetType()
t
现在是一个类型。但是,如果我试图做到这一点:
new GenericThing<t>
我得到一个警告说,预计类型或命名空间。我错过了什么?
t
是在运行时创建的Type对象。泛型期望类型名称,在编译时解析。要创建一个通用的在运行时,你必须使用MakeGenericType
例如:
Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t));
t
是Type
类型的对象实例,即东西,只存在于运行。泛型在编译时工作,并期望类型的名称。
我想你同意以下无厘头:
Type t = thing.GetType()
TypeOfThing instance = new t();
而出于同样的原因,你不能传递一个类型实例作为通用的参数。
Type
是一类代表一个类型,而不是实际为之一,所以你不能在预期的类型或类型参数的场所使用的Type
一个实例。
你应该做这样的事情:
var youGeneric = typeof(GenericThing<>).MakeGenericType(t)
.GetConstructor(Type.EmptyTypes)
.Invoke(null);