【问题标题】:Creating object using Reflection.Emit in a simple compiler在简单的编译器中使用 Reflection.Emit 创建对象
【发布时间】:2015-02-16 08:41:07
【问题描述】:

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

【问题讨论】:

标签: c# reflection.emit


【解决方案1】:

你需要三遍:

  1. 为每个类创建一个TypeBuilder
  2. 为每个类,为每个成员方法(包括构造函数)创建一个MethodBuilder
  3. 对于每个类,使用ILGenerator 生成方法体。当你完成每个类的迭代方法时,调用CreateType()

当你发出newobj 时,你可以传递一个代表构造函数的ConstructorBuilder,这意味着类和构造函数还不必被冻结。

【讨论】:

  • 啊,对,我的错误是在我的测试代码中,我使用 TypeBuilder.GetConstructor() 来获取默认构造函数,并且该方法需要首先创建类型。但我应该创建自己的构造函数并按照你所说的传递 MethodBuilder 。谢谢。
  • "你可以传递一个代表构造函数的MethodBuilder"你不是说ConstructorBuilder吗?
  • @svick:是的,我以为是一样的,但是构造函数和普通方法之间共享的只是MethodBase,并且层次结构超出了这个范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多