【发布时间】:2011-10-30 12:36:23
【问题描述】:
我被一个 C# 错误弄糊涂了。
Type t = thing.GetType()
t 现在是一种类型。但如果我尝试这样做:
new GenericThing<t>
我收到一条警告说需要类型或命名空间。我错过了什么?
【问题讨论】:
标签: c# types namespaces
我被一个 C# 错误弄糊涂了。
Type t = thing.GetType()
t 现在是一种类型。但如果我尝试这样做:
new GenericThing<t>
我收到一条警告说需要类型或命名空间。我错过了什么?
【问题讨论】:
标签: c# types namespaces
你应该这样做:
var youGeneric = typeof(GenericThing<>).MakeGenericType(t)
.GetConstructor(Type.EmptyTypes)
.Invoke(null);
【讨论】:
Type 是一个表示类型而不是真正存在类型的类,因此您不能在需要类型的地方使用Type的实例或类型参数。
【讨论】:
t 是Type 类型的对象实例,即仅在运行时存在的东西。泛型在编译时工作,需要类型的名称。
我认为您同意以下内容没有意义:
Type t = thing.GetType()
TypeOfThing instance = new t();
出于同样的原因,您不能将类型实例作为泛型的参数传递。
【讨论】:
t 是在运行时创建的 Type 对象。泛型需要一个类型名称,在编译时解析。要在运行时创建泛型,您必须使用MakeGenericType
例如:
Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t));
【讨论】: