gpt4 book ai didi

c# - TypeBuilder 的 Type.GetMethod 替代方案

转载 作者:太空狗 更新时间:2023-10-29 17:49:33 25 4
gpt4 key购买 nike

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

我真正关心的事情是:

  1. 有什么方法可以获取 TypeBuilder 中定义的方法、字段、属性、构造函数等的列表,或者我真的必须制作一个 TypeBuilderWrapper 我自己跟踪所有这些实体?它必须将它们存储在内部某处,所以必须有某种方法来提取它们?

  2. GetMethod 方法非常方便,因为它可以在考虑继承和泛型协变的情况下找到最适合的方法覆盖。我真的必须自己为 TypeBuilderWrapper 重新实现它吗?

同样的问题可能适用于 MethodBuilderFieldBuilder 等,我相信它们没有实现 MethodInfoFieldInfo 分别。

最佳答案

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) {}
}

所以生成类的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.

回答您的问题,在TypeBuilder 中无法获取方法、属性等的列表。直到你打电话 CreateType .但是你应该记住这些方法,属性是由你的代码创建的,所以你应该知道它们。如果你想创建一些类 TypeBuilderWrapper , 这是你的选择。但在我看来,你应该这样做:

  • 为您的 X 语言编写您自己的模型(XClassXMethodXParam 等)。
  • 打开您的 XParser将 X 文件解析为语言模型对象。
  • 对创建的模型进行一些分析,以在模型之间建立联系。例如:在 sample.x以上,在 B.method2 , 参数 A a应该有一个链接到 class A模型。
  • 使用Reflection.Emit创建目标程序集。记住顺序是:定义类,定义类的方法,定义类方法的主体,等等。然后调用CreateType。完成所有。可以根据您的语言设计更改顺序。

这些都是我的想法,代码可能无法运行。当我创建简单愚蠢的语言时,我创建了类似的东西。希望我能帮到你。

关于c# - TypeBuilder 的 Type.GetMethod 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14173863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com