【问题标题】:Passing a type generated at RunTime (via TypeBuilder) to GenericClass将运行时生成的类型(通过 TypeBuilder)传递给 GenericClass
【发布时间】:2011-07-28 05:37:53
【问题描述】:

我想将在运行时(通过 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下,我不介意知道。

【问题讨论】:

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


    【解决方案1】:

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

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多