在简单的编译器中使用Reflection.Emit创建对象

时间:2015-02-15 18:04:55

标签: c# reflection.emit

要使用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();
    }
}

1 个答案:

答案 0 :(得分:1)

你需要三次通过:

  1. 为每个班级
  2. 创建TypeBuilder
  3. 对于每个类,为每个成员方法创建MethodBuilder,包括构造函数
  4. 对于每个类,使用ILGenerator生成方法体。在完成每个类的迭代方法后,请调用CreateType()
  5. 当您发出newobj时,您可以传递代表构造函数的ConstructorBuilder,这意味着类和构造函数不必被冻结。