我正在使用Reflection.Emit制作一个与.NET兼容的编译器。问题是,虽然TypeBuilder是从Type派生的,但它不允许我使用Type提供的所有方便的方法。
我真正关心的问题是:
TypeBuilder中定义的方法、字段、属性、构造函数等列表,或者我真的必须自己创建一个跟踪所有这些实体的TypeBuilderWrapper?它必须把它们藏在里面的某个地方,所以一定有办法提取它们?GetMethod方法非常方便,因为它可以找到覆盖继承和泛型协方差的最佳拟合方法。我真的需要自己为TypeBuilderWrapper重新实现它吗?同样的问题可能也适用于MethodBuilder、FieldBuilder等,我认为它们没有分别实现MethodInfo和FieldInfo的查找方法。
发布于 2013-03-10 07:36:17
TypeBuilder,MethodBuilder等都是Type,MethodInfo,但在你打电话给TypeBuilder.CreateType()之前,他们并不具备Type,MethodInfo的全部能力。TypeBuilder是从Type派生出来的,因为它允许您在构建类A和B时,可以在两个方向上引用它们,而不需要完成它们。让我举一个例子:
// sample.x
class A {
void method1(B b) {}
}
class B {
void method2(A a) {}
}因此,生成类C#和B的代码如下:
// ...
// 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,这是您的选择。但在我看来,你应该这样做:
XClass、XMethod、XParam等)。XParser转换为将X文件解析为语言模型对象。sample.x中,在B.method2中,参数A a应该有一个指向class A模型的链接。Reflection.Emit创建目标程序集。记住顺序是:定义类、定义类的方法、定义类方法的主体等,然后调用CreateType完成所有操作。顺序可以更改取决于您的语言设计。这些都是我的主意,代码可能不起作用。当我创造我的简单愚蠢的语言时,我创造了一些类似的东西。希望我能帮你。
https://stackoverflow.com/questions/14173863
复制相似问题