gpt4 book ai didi

c# - 是否可以在 C# 中向现有模块添加类型?

转载 作者:行者123 更新时间:2023-11-30 16:09:54 28 4
gpt4 key购买 nike

我有一种情况需要动态地向我的应用程序添加类型。基本上,发生的事情是我们想要使用 EF6,但仍然对数据库运行完全动态的查询并返回键/值对的字典。 (遗留代码,不要问)

我可以通过调用 context.Database.SqlQuery 并将动态加载的类型传递给它来实现这一点,该类型是我动态创建的。

我正在使用我在网上找到的这种方法。

private static TypeBuilder CreateTypeBuilder(
string assemblyName, string moduleName, string typeName)
{

TypeBuilder typeBuilder = AppDomain.CurrentDomain
.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Run)
.DefineDynamicModule(moduleName)
.DefineType(typeName, TypeAttributes.Public);
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
return typeBuilder;
}

效果很好,但每次我添加新类型(可能经常)时,它都会加载一个新的动态程序集。这可能会导致数百个程序集仅使用一次。

我可以使用以下语句拉下动态程序集:

var loadedAssembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(ex => ex.GetName().Name == assemblyName);

我还可以使用以下方法获取动态模块:

var loadedModule = loadedAssembly.GetModules().FirstOrDefault(ex => ex.ScopeName == moduleName);

但据我所知,我无法添加超过该点的任何类型。

我是不是找错了树?

最佳答案

关键部分是这一行:

.DefineDynamicAssembly(new AssemblyName(assemblyName), AssemblyBuilderAccess.Run)
.DefineDynamicModule(moduleName)

该方法返回动态程序集和模块的实例。不是每次需要新类型时都调用 DefineDynamicAssemblyDefineDynamicModule,创建动态程序集和模块一次,然后在模块上调用 DefineType您需要的每种类型。也许是这样的:

internal static class DyanamicTypeBuilder
{
private static readonly AssemblyBuilder _assembly;
private static readonly ModuleBuilder _module;
private static readonly object _syncBlk = new object();

static DyanamicTypeBuilder()
{
_assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyDyanmicAssembly"), AssemblyBuilderAccess.Run);
_module = _assembly.DefineDynamicModule("MyDynamicModule");
}

private static TypeBuilder CreateTypeBuilder(string typeName)
{
lock (_syncBlk)
{
var typeBuilder = _module.DefineType(typeName, TypeAttributes.Public);
typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);
return typeBuilder;
}
}
}

关于c# - 是否可以在 C# 中向现有模块添加类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26868447/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com