【发布时间】:2013-09-24 18:16:11
【问题描述】:
[注意:我不认为这个问题与上面链接的问题重复,正如我在下面的更新中解释的那样。]
有没有办法使用反射来定义/实例化泛型类?
所以我有一堆类,每个类都拥有一个通用类的实例,该实例共享其所有者的类型:
public class GenericClass<T>
{
T Owner { get; set; }
public GenericClass(T owner) { Owner = owner; }
}
public class MyClass
{
private GenericClass<MyClass> myGenericObject;
public MyClass() { myGenericObject = new GenericClass<MyClass>(this); }
}
这可行,但当然我必须在 GenericClass 定义中明确指定“MyClass”作为参数。我希望能够做这样的事情:
private GenericClass<typeof(this)> myGenericObject; // Error: invalid token
是否有在编译时根据包含的类动态指定泛型对象的类型?
更新:在阅读了thesequestions 的答案后,我了解到我可以像这样实例化一个局部变量:
var myGenericObject = Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(this.GetType()));
但是,当然,this 关键字只能在方法内部使用(因此,例如,我可以将这行代码放在MyClass 的构造函数中)。但是我不能使用这种方法来定义一个 instance 变量(即,myGenericObject,在上面的代码中)。有什么方法可以动态指定泛型实例变量吗?
【问题讨论】:
-
您尝试了吗:Activator.CreateInstance
()。它是内置的。 -
泛型类只能有泛型实例字段。
-
@AlexDenysenko:这就是小费;我来看看 CreateInstance 的通用版本。