2

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

有没有办法使用反射来定义/实例化泛型类?

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

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

无论如何,在编译时是否可以根据包含的类动态指定泛型对象的类型?


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

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

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

4

3 回答 3

2

关于您的更新,您可以将任何传递TypeMakeGenericType. 例如,以下也有效:

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);
于 2013-09-24T18:29:03.130 回答
0

有一个静态的内置构造:

Activator.CreateInstance()

看看过载。

更新

public Type FakeType { get; private set; }
public T CreateInstance<T>() where T : SomeEntityBase
{
     return (T) Activator.CreateInstance(FakeType);
}
于 2013-09-24T18:19:46.200 回答
0

不确定这是否是您要寻找的,但可以尝试继承:

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() { }
}
于 2013-09-24T18:29:54.017 回答