我想动态地将任意数量的类型组合到一个继承所有这些类型的新类型中。目前它只能用于接口。如何创建从一个封闭的泛型派生的动态类型
我绝对知道有很多陷阱和沉重的性能影响,但这仅用于我的测试代码 - 更具体,用于创建多个接口嘲笑。
所以,基本上我有一个类(TypeBuilder
- 见下面的代码),它能够创建这些类型。它适用于“简单”类型。但我希望能够通过它关闭泛型类型。当试图用我目前的实现时,当我尝试创建动态类型(通过TypeBuilder.CreateType
)时抛出TypeLoadException
。
我必须告诉TypeBuilder
新类型是一个泛型类型,虽然它只是从封闭泛型类型派生?如果是的话,我该怎么做?
这是我如何使用它:
MultiTypeBuilder multiTypeBuilder =
new MultiTypeBuilder(Guid.NewGuid().ToString());
multiTypeBuilder.SetBaseType(typeof(IFoo));
multiTypeBuilder.SetBaseType(typeof(IBar<IFoo>));
multiTypeBuilder.SetBaseType(typeof(IBaz));
Type multiType = multiTypeBuilder.CreateType();
这是我目前的执行(简化的一点点):
private class MultiTypeBuilder
{
private readonly TypeBuilder m_TypeBuilder;
public MultiTypeBuilder(string name)
{
ModuleBuilder multiTypeModule = GetMultiTypeModule();
TypeAttributes attributes = TypeAttributes.Interface | TypeAttributes.SpecialName | TypeAttributes.Abstract | TypeAttributes.Public;
m_TypeBuilder = multiTypeModule.DefineType(name, attributes);
}
public void SetBaseType(Type baseType)
{
m_TypeBuilder.AddInterfaceImplementation(baseType);
}
public Type CreateType()
{
return m_TypeBuilder.CreateType();
}
private static ModuleBuilder GetMultiTypeModule()
{
AssemblyName assemblyName = new AssemblyName(c_DynamicAssemblyName);
AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
return assemblyBuilder.DefineDynamicModule("MultiTypeAssembly");
}
}
感谢您的支持!
在你的例子中,定义了IBar这样T可能只是一个接口?如果没有,你可以试试。 –
Fantius
不,它不是,它不是,因为我不知道编译时的类型。 –
用空IBar,IBaz和IFoo接口在LINQPad中编译你的代码可以正常工作,你可以发布一些失败的代码吗?查看http://ideone.com/is5gU的输出 –