反射发出以生成简单的继承

时间:2018-10-10 12:21:26

标签: c# .net .net-core

我正在尝试通过reflection.emit动态生成以下类的层次结构:

public class Main
{
    public class A { A(){} }
    public class B : A { B() : base() {} }
}

这是我尝试在.net core框架上运行的程序(在.net上使用了类似的程序,但例外是相同的):

using System;
using System.Reflection;
using System.Reflection.Emit;    
public class Program
{
    public static void Main()
    {
        AssemblyBuilder assemBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName() { Name = "DynamicAssembly" }, AssemblyBuilderAccess.Run);
        TypeBuilder main_builder = assemBuilder.DefineDynamicModule("DynamicModule").DefineType("Main", TypeAttributes.Public);

        TypeBuilder a_builder = main_builder.DefineNestedType("A", TypeAttributes.NestedPublic);
        TypeBuilder b_builder = main_builder.DefineNestedType("B", TypeAttributes.NestedPublic, a_builder);

        var a_constr = a_builder.DefineDefaultConstructor(MethodAttributes.Public);
        var b_cnstr = b_builder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes);

        {
            //  Creation b constructor    
            var il_gen = b_cnstr.GetILGenerator();
            il_gen.Emit(OpCodes.Ldarg_0);
            il_gen.Emit(OpCodes.Call, a_constr);
            il_gen.Emit(OpCodes.Ret);
        }
        a_builder.CreateType();
        b_builder.CreateType();
        main_builder.CreateType();
    }
}

但是在执行期间,程序在b_builder.CreateType()失败,并显示异常消息(这里是.net core函数,我无法调试): enter image description here

reflection.emit个错误吗?我不知道我的代码有什么问题

1 个答案:

答案 0 :(得分:3)

文档main_builder.CreateType(); a_builder.CreateType(); b_builder.CreateType(); 备注部分的第一行告诉我们:

  

如果此类型是嵌套类型,则必须先在封闭类型上调用CreateType方法,然后再在嵌套类型上调用

https://docs.microsoft.com/en-us/dotnet/api/system.reflection.emit.typebuilder.createtype

因此更改呼叫顺序,它应该可以工作:

set src='some_table';
select count(*) from $src;

请参阅https://dotnetfiddle.net/bxYCQb