c# - 将在运行时生成的类型(通过 TypeBuilder)传递给 GenericClass

标签 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 下,我不介意知道。

最佳答案

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

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

这样,您就可以利用内部的泛型 Read() ,但不在外面。根据你想做什么,也许使用接口(interface)而不是泛型会更好。 new()可以通过为每个生成的类型生成一个工厂类型来模拟约束,这些类型实现以下(非生成的)接口(interface):

interface IWhatever { … }

interface IWhateverFactory
{
    IWhatever Create();
}

关于c# - 将在运行时生成的类型(通过 TypeBuilder)传递给 GenericClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522954/

相关文章:

c# - 如何让 WCF 生成代理列表?

c# - 重写表达式以用自定义方法替换 List.Contains

c# - 如何在 OxyPlot 中强制 x 轴保持在 0?

Java 泛型 : Bound mismatch

.net-3.5 - 使用WIX3.6通过Burn安装.NET Framework 3.5 SP1

带空检查的 C# out 参数

java - 存在原始打字问题

c# - 使用列表和未定义类型作为参数和返回类型

c# - 使用 LINQ to DataTable 确定外键表是否与主键表有任何链接

.net - URL 中的 ASP.NET aspxerrorpath