我想動態地將任意數量的類型組合到一個繼承所有這些類型的新類型中。目前它只能用於接口。如何創建從一個封閉的泛型派生的動態類型
我絕對知道有很多陷阱和沉重的性能影響,但這僅用於我的測試代碼 - 更具體,用於創建多個接口嘲笑。
所以,基本上我有一個類(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的輸出 –