Я пытаюсь динамически объединить любое количество типов в новый тип, который наследует все эти типы. На данный момент это должно работать только для интерфейсов.
Я абсолютно осознаю, что есть много подводных камней и значительное влияние на производительность, но это используется только для моего тестового кода, а точнее - для создания макетов для нескольких интерфейсов.
Итак, в основном у меня есть класс (TypeBuilder
- см. Код ниже), который может создавать эти типы. Это работает довольно хорошо для «простых» типов. Но я хочу иметь возможность передавать закрытые универсальные типы. При попытке сделать это с моей текущей реализацией выдается TypeLoadException
, когда я пытаюсь создать динамический тип (через TypeBuilder.CreateType
).
Должен ли я сказать 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");
}
}
Спасибо за вашу поддержку!