使用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); }