Imp*_*rks 9 .net c# reflection.emit getmethod typebuilder
我正在使用.NET兼容的编译器Reflection.Emit.问题是,虽然TypeBuilder是派生自Type,但它不允许我使用Type提供的所有方便的方法.
我真正关心的问题是:
有没有办法获得a中定义的方法,字段,属性,构造函数等的列表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) {}
}
Run Code Online (Sandbox Code Playgroud)
因此,C#代码来生成类A和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.
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完成然后全部.订单可以根据您的语言设计进行更改.这些都是我的想法,代码可能不起作用.当我创建简单愚蠢的语言时,我创造了类似的东西.希望我能帮助你.
| 归档时间: |
|
| 查看次数: |
1195 次 |
| 最近记录: |