TypeBuilder的Type.GetMethod替代方案

Imp*_*rks 9 .net c# reflection.emit getmethod typebuilder

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

我真正关心的问题是:

  1. 有没有办法获得a中定义的方法,字段,属性,构造函数等的列表TypeBuilder,或者我真的需要TypeBuilderWrapper自己跟踪所有这些实体?它必须将它们存储在内部,所以必须有一些方法来提取它们?

  2. GetMethod方法非常方便,因为它可以找到最佳拟合方法覆盖考虑继承和通用协方差.我真的必须自己重新实现TypeBuilderWrapper吗?

同样的问题也可能适用于MethodBuilder,FieldBuilder等它,我相信,没有实现的查找方法MethodInfo,并FieldInfo分别.

Jac*_*Dam 9

TypeBuilder,MethodBuilder等都是Type,MethodInfo但他们没有的所有能力Type,MethodInfo直到你打电话TypeBuilder.CreateType().原因TypeBuilderType它可以让你在建造课程的A同时B,你可以在两个方向上引用它们而不需要完成它们.让我举个例子:

// sample.x
class A {
    void method1(B b) {}
}

class B {
    void method2(A a) {}
}
Run Code Online (Sandbox Code Playgroud)

因此,C#代码来生成类AB将是:

// ...
// 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. 
Run Code Online (Sandbox Code Playgroud)

回答你的问题,在TypeBuilder你打电话之前,没有办法获得方法,属性等列表CreateType.但是你应该记住这些方法,属性是由你的代码创建的,所以你应该全部了解它们.如果你想创建一些课程TypeBuilderWrapper,那就是你的选择.但是从我看来,你应该做的事情如下:

  • 写自己的模型(XClass,XMethod,XParam等)为您X语言.
  • 转而XParser将X文件解析为语言模型对象.
  • 对创建的模型进行一些分析,以在模型之间创建链接.例如:在sample.x上面,in B.method2,参数A a应该有一个指向class A模型的链接.
  • 使用Reflection.Emit创建目标组件.记住顺序是:定义类,定义类的方法,定义类方法的主体等等.然后调用CreateType完成然后全部.订单可以根据您的语言设计进行更改.

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