编程语言
首页 > 编程语言> > 是否可以在C#中向现有模块添加类型?

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

作者:互联网

我遇到需要将类型动态添加到应用程序的情况.
基本上,这是我们要使用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)

该方法返回动态程序集和模块的实例.不必每次需要新类型时都调用DefineDynamicAssembly和DefineDynamicModule,而是一次创建动态程序集和模块,然后针对所需的每种类型在模块上调用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;
        }
    }
}

标签:reflection,entity-framework-6,c,net,entity-framework
来源: https://codeday.me/bug/20191121/2048900.html