要使用Reflection.Emit
创建类的实例,我需要发出OpCodes.Newobj
,但它需要创建类的构造函数。因此,如果我编写自己的编译器,如何为创建源代码(而不是运行时库)中定义的另一个类的实例的方法生成代码?
我在2遍中进行代码生成,首先我为每个类创建TypeBuilder
,然后向它们添加方法存根,以便在第二次传递时引用它们。但是我无法为那些存根调用TypeBuilder.CreateType
,因为我会得到一个异常,Reflection.Emit需要定义所有方法并拥有正文。但与此同时,我无法为需要创建源代码中定义的类实例的方法完成代码生成。
那么,我该如何为此创建代码:
class Foo
{
}
class Bar
{
Foo DoSomething()
{
return new Foo();
}
}
和此:
class Foo
{
public Foo Create()
{
return new Foo();
}
}
答案 0 :(得分:1)
你需要三次通过:
TypeBuilder
MethodBuilder
,包括构造函数ILGenerator
生成方法体。在完成每个类的迭代方法后,请调用CreateType()
当您发出newobj
时,您可以传递代表构造函数的ConstructorBuilder
,这意味着类和构造函数不必被冻结。