类型.TypeBuilder的替代方法
本文关键字:方法 TypeBuilder 类型 | 更新日期: 2023-09-27 17:50:43
我正在使用Reflection.Emit
制作。net兼容的编译器。问题是,虽然TypeBuilder
是从Type
派生出来的,但它不允许我使用Type提供的所有方便的方法。
我真正关心的事情是:
-
是否有任何方法可以获得在
TypeBuilder
中定义的方法,字段,属性,构造器等列表,或者我真的必须使TypeBuilderWrapper
自己跟踪所有这些实体?它一定把它们储存在里面的某个地方,所以一定有办法把它们取出来吧? -
GetMethod
方法是非常方便的,因为它可以找到最好的拟合方法覆盖考虑继承和泛型协方差。我真的要为TypeBuilderWrapper
重新实现它吗?
同样的问题可能适用于MethodBuilder
, FieldBuilder
等,我相信,不实现MethodInfo
和FieldInfo
的查找方法。
TypeBuilder
, MethodBuilder
等是Type
, MethodInfo
,但他们没有Type
, MethodInfo
的所有能力,直到你调用TypeBuilder.CreateType()
。TypeBuilder
源自Type
的原因是,它允许您在构建A
和B
类时,可以在两个方向上引用它们,而无需完成它们。我举个例子:
// sample.x
class A {
void method1(B b) {}
}
class B {
void method2(A a) {}
}
所以生成A
和B
类的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
来完成这一切。顺序可以根据你的语言设计来改变。
这些都是我的想法,代码可能不起作用。当我创造简单愚蠢的语言时,我创造了类似的东西。希望我能帮你。