首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Type.GetMethod替代TypeBuilder

Type.GetMethod替代TypeBuilder
EN

Stack Overflow用户
提问于 2013-01-05 16:33:25
回答 1查看 1.3K关注 0票数 9

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

我真正关心的问题是:

  1. 是否有任何方法可以获得在TypeBuilder中定义的方法、字段、属性、构造函数等列表,或者我真的必须自己创建一个跟踪所有这些实体的TypeBuilderWrapper?它必须把它们藏在里面的某个地方,所以一定有办法提取它们?
  2. GetMethod方法非常方便,因为它可以找到覆盖继承和泛型协方差的最佳拟合方法。我真的需要自己为TypeBuilderWrapper重新实现它吗?

同样的问题可能也适用于MethodBuilderFieldBuilder等,我认为它们没有分别实现MethodInfoFieldInfo的查找方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-10 07:36:17

TypeBuilderMethodBuilder等都是TypeMethodInfo,但在你打电话给TypeBuilder.CreateType()之前,他们并不具备TypeMethodInfo的全部能力。TypeBuilder是从Type派生出来的,因为它允许您在构建类AB时,可以在两个方向上引用它们,而不需要完成它们。让我举一个例子:

代码语言:javascript
复制
// sample.x
class A {
    void method1(B b) {}
}

class B {
    void method2(A a) {}
}

因此,生成类C#和B的代码如下:

代码语言:javascript
复制
// ...
// 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语言编写您自己的模型(XClassXMethodXParam等)。
  • XParser转换为将X文件解析为语言模型对象。
  • 对创建的模型进行一些分析,以便在模型之间创建链接。例如:在上面的sample.x中,在B.method2中,参数A a应该有一个指向class A模型的链接。
  • 使用Reflection.Emit创建目标程序集。记住顺序是:定义类、定义类的方法、定义类方法的主体等,然后调用CreateType完成所有操作。顺序可以更改取决于您的语言设计。

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14173863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档