使用反射实例化泛型类
本文关键字:泛型类 实例化 反射 | 更新日期: 2023-09-27 18:32:42
[注意:我不认为这个问题是上面链接的问题的重复,正如我在下面的更新中所解释的那样。
有没有办法使用反射来定义/实例化泛型类?
所以我有一堆类,每个类都有一个泛型类的实例,该实例共享其所有者的类型:
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); }
}
这有效,但当然我必须明确指定"MyClass"作为 GenericClass 定义中的参数。我希望能够做这样的事情:
private GenericClass<typeof(this)> myGenericObject; // Error: invalid token
是否有无论如何可以在编译时根据包含类动态指定泛型对象的类型?
更新:在阅读了这些问题的答案后,我了解到我可以像这样实例化一个局部变量:
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);
不确定这是否是您正在寻找的,但可以尝试继承:
public class GenericClass<T>
{
T Owner { get; set; }
public GenericClass(T owner) { Owner = owner; }
}
public abstract class MyClassBase<T> where T : MyClassBase<T>
{
protected GenericClass<T> MyGenericObject { get; private set; }
protected MyClassBase() { MyGenericObject = new GenericClass<T>((T)this); }
}
public class MyClass1 : MyClassBase<MyClass1>
{
public MyClass1() { }
}
public class MyClass2 : MyClassBase<MyClass2>
{
public MyClass2() { }
}
为此有静态内置结构:
Activator.CreateInstance()
看看过载。
更新
public Type FakeType { get; private set; }
public T CreateInstance<T>() where T : SomeEntityBase
{
return (T) Activator.CreateInstance(FakeType);
}