9

を使用して.NET準拠のコンパイラを作成していますReflection.Emit。問題は、TypeBuilderから派生したもののType、Typeが提供するすべての便利なメソッドを使用できないことです。

私が本当に心配していることは次のとおりです。

  1. で定義されたメソッド、フィールド、プロパティ、コンストラクターなどのリストを取得する方法はありますかTypeBuilder、または私は本当にTypeBuilderWrapperそれらすべてのエンティティを自分で追跡するを作成する必要がありますか?それらを内部のどこかに保存する必要があるので、それらを抽出する方法が必要ですか?

  2. このGetMethod方法は、継承と一般的な共分散を考慮に入れて最適な方法のオーバーライドを見つけることができるため、非常に便利です。私は本当にそれを自分で再実装する必要がありTypeBuilderWrapperますか?

同じ問題が、とのルックアップメソッドをそれぞれ実装していないなどにも当てはまるとMethodBuilder思います。FieldBuilderMethodInfoFieldInfo

4

1 に答える 1

9

TypeBuilder、、MethodBuilderなどはType、ですが、を呼び出すまで、MethodInfoのすべての能力を持っているわけではありません。その理由は、クラスを構築しているときに、それらを終了せずに両方向で参照できるためです。例を挙げましょう:TypeMethodInfoTypeBuilder.CreateType()TypeBuilderTypeAB

// 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ます。XMethodXParam
  • を回しXParserて、Xファイルを言語モデルオブジェクトに解析します。
  • 作成したモデルを分析して、モデル間のリンクを作成します。例:sample.x上記のではB.method2、パラメータにはモデルA aへのリンクが必要です。class A
  • Reflection.Emitターゲットアセンブリを作成するために使用します。順序は次のとおりです。クラスの定義、クラスのメソッドの定義、クラスのメソッドの本体の定義など。次に、呼び出しCreateTypeて終了し、すべてを終了します。順序は、言語の設計に応じて変更できます。

これらはすべて私の考えです。コードが機能しない可能性があります。単純な愚かな言語を作成したとき、私はそのようなものを作成しました。私があなたを助けることができることを願っています。

于 2013-03-10T07:36:17.220 に答える