类型.TypeBuilder的替代方法

本文关键字:方法 TypeBuilder 类型 | 更新日期: 2023-09-27 17:50:43

我正在使用Reflection.Emit制作。net兼容的编译器。问题是,虽然TypeBuilder是从Type派生出来的,但它不允许我使用Type提供的所有方便的方法。

我真正关心的事情是:

  1. 是否有任何方法可以获得在TypeBuilder中定义的方法,字段,属性,构造器等列表,或者我真的必须使TypeBuilderWrapper自己跟踪所有这些实体?它一定把它们储存在里面的某个地方,所以一定有办法把它们取出来吧?

  2. GetMethod方法是非常方便的,因为它可以找到最好的拟合方法覆盖考虑继承和泛型协方差。我真的要为TypeBuilderWrapper重新实现它吗?

同样的问题可能适用于MethodBuilder, FieldBuilder等,我相信,不实现MethodInfoFieldInfo的查找方法。

类型.TypeBuilder的替代方法

TypeBuilder, MethodBuilder等是Type, MethodInfo,但他们没有Type, MethodInfo的所有能力,直到你调用TypeBuilder.CreateType()TypeBuilder源自Type的原因是,它允许您在构建AB类时,可以在两个方向上引用它们,而无需完成它们。我举个例子:

// sample.x
class A {
    void method1(B b) {}
}
class B {
    void method2(A a) {}
}
所以生成AB类的c#代码是:
// ...
// define classes
TypeBuilder classA = moduleBuilder.DefineType("A");
TypeBuilder classB = moduleBuilder.DefineType("B");
// define class A's methods
MethodBuilder method1 = classA.defineMethod("method1", MethodAttributes.Public);
method1.SetParameters(classB);
// ... build method body
// define class B's methods
MethodBuilder method2 = classB.defineMethod("method2", MethodAttributes.Public);
method1.SetParameters(classA);
// ... build method body
// finish classes
classA.CreateType();
classB.CreateType();
// this time you can use GetMethod but you can not modify classes any more. 

回答你的问题,没有办法在TypeBuilder中获得方法,属性等列表,直到你调用CreateType。但是你应该记住这些方法,属性是由你的代码创建的,所以你应该了解它们。如果您想创建某个类TypeBuilderWrapper,这是您的选择。但在我看来,你应该这样做:

  • 为您的X语言编写自己的模型(XClass, XMethod, XParam等)
  • 把你的XParser解析成语言模型对象。
  • 对已创建的模型进行一些分析,以创建模型之间的链接。例如:在上面的sample.x中,在B.method2中,参数A a应该有一个链接到class A模型。
  • 使用Reflection.Emit创建目标程序集。记住顺序是:定义类,定义类的方法,定义类的方法体,等等。然后调用CreateType来完成这一切。顺序可以根据你的语言设计来改变。

这些都是我的想法,代码可能不起作用。当我创造简单愚蠢的语言时,我创造了类似的东西。希望我能帮你。