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) {}
}
したがって、クラスを生成するための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.
TypeBuilder
質問に答えてください。を呼び出すまで、メソッドやプロパティなどのリストを取得する方法はありませんCreateType
。ただし、これらのメソッドを覚えておく必要があります。プロパティはコードによって作成されるため、すべてを知っておく必要があります。クラスを作成したい場合はTypeBuilderWrapper
、それを選択します。しかし、私の意見から、あなたは次のようなことをすべきです:
- X言語用に独自のモデル(、、、など)を作成し
XClass
ます。XMethod
XParam
- を回し
XParser
て、Xファイルを言語モデルオブジェクトに解析します。
- 作成したモデルを分析して、モデル間のリンクを作成します。例:
sample.x
上記のではB.method2
、パラメータにはモデルA a
へのリンクが必要です。class A
Reflection.Emit
ターゲットアセンブリを作成するために使用します。順序は次のとおりです。クラスの定義、クラスのメソッドの定義、クラスのメソッドの本体の定義など。次に、呼び出しCreateType
て終了し、すべてを終了します。順序は、言語の設計に応じて変更できます。
これらはすべて私の考えです。コードが機能しない可能性があります。単純な愚かな言語を作成したとき、私はそのようなものを作成しました。私があなたを助けることができることを願っています。