使用reflection实例化generics类

[ 注意:我不相信这个问题与上面链接的问题重复,正如我在下面的更新中解释的那样。]

有没有办法使用reflection定义/实例化generics类?

所以我有一堆类,每个类都拥有一个generics类的实例,它共享其所有者的类型:

public class GenericClass { T Owner { get; set; } public GenericClass(T owner) { Owner = owner; } } public class MyClass { private GenericClass myGenericObject; public MyClass() { myGenericObject = new GenericClass(this); } } 

这有效,但当然我必须明确指定“MyClass”作为GenericClass定义中的参数。 我希望能够做到这样的事情:

 private GenericClass myGenericObject; // Error: invalid token 

无论如何,在编译时根据包含的类动态指定generics对象的类型?


更新:在阅读了这些 问题的答案之后,我了解到我可以像这样实例化一个局部变量:

 var myGenericObject = Activator.CreateInstance(typeof(GenericClass).MakeGenericType(this.GetType())); 

但是,当然, this关键字只能在方法中使用(例如,我可以将这行代码放在MyClass的构造函数中)。 但我不能使用这种方法来定义一个实例变量(即上面的代码中的myGenericObject )。 有没有办法动态指定通用实例变量?

关于您的更新,您可以将任何Type传递给MakeGenericType 。 例如,以下内容也有效:

 var myObject = new MyClass(); var myGenericObject = Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(typeof(MyClass)), myObject); Console.WriteLine(myGenericObject.GetType()); 

输出:

 ConsoleApplication1.GenericClass`1[ConsoleApplication1.MyClass] 

myObject.GetType()也做同样的事情:

 var myGenericObject = Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(myObject.GetType()), myObject); 

不确定这是你想要的,但可以尝试inheritance:

 public class GenericClass { T Owner { get; set; } public GenericClass(T owner) { Owner = owner; } } public abstract class MyClassBase where T : MyClassBase { protected GenericClass MyGenericObject { get; private set; } protected MyClassBase() { MyGenericObject = new GenericClass((T)this); } } public class MyClass1 : MyClassBase { public MyClass1() { } } public class MyClass2 : MyClassBase { public MyClass2() { } } 

有静态内置构造:

 Activator.CreateInstance() 

看看过载。

UPDATE

 public Type FakeType { get; private set; } public T CreateInstance() where T : SomeEntityBase { return (T) Activator.CreateInstance(FakeType); }