我正在尝试通过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
函数,我无法调试):
是reflection.emit
个错误吗?我不知道我的代码有什么问题
答案 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;