将在RunTime生成的类型(通过TypeBuilder)传递给GenericClass

时间:2011-04-02 11:46:32

标签: c# generics .net-3.5 reflection.emit

我想将在运行时生成的类型(通过TypeBuilder)传递给泛型类中的泛型方法。我无法将其作为对象传递,因为反射用于查找各种属性。

据我了解,由于泛型应用于编译时而不是运行时,因此无法完成此操作。

我知道我可以改变像

这样的方法
public T Read()
{
     T data = new T()
     ...
     return data;
}

就像是

public object Read(Type newType)
{
     object data =  Activator.CreateInstance(newType);  
     ...
     return data;
}

但是当类型已知时,这显然会失去泛型的所有优点,所以我可能会以两种方法结束,遗憾的是这些方法也会复制其他一些其他辅助函数。

有没有更好的方法来解决这个问题?

这个特殊项目需要在3.5框架下工作,但如果在3.5中不可能,但是在4.0以下,我不介意知道。

1 个答案:

答案 0 :(得分:4)

假设Read()class Reader<T> where T : new()的成员,您可以像这样调用通用版本(如果您有多个名称为{GetMethod()的方法,则可能使用Read的另一个重载1}}在那种类型上):

Type readerType = typeof(Reader<>).MakeGenericType(generatedType);
object result = readerType
                  .GetMethod("Read")
                  .Invoke(Activator.CreateInstance(readerType), new object[0]);

这样,您可以在Read()内部使用泛型,但不能在外部使用。根据你想要做的事情,也许最好使用接口而不是泛型。可以通过为每个生成的类型生成工厂类型来模拟new()约束,这些类型实现以下(非生成的)接口:

interface IWhatever { … }

interface IWhateverFactory
{
    IWhatever Create();
}