0

次の関数を C# コード (ilGenerator.Emit を使用) でシミュレートする必要があります。

public void AssignAttribute(ref ValueHolder output, Assignment assignment) {
    ResultAttribute attribute = null;

    if ( (attribute = output.MultipleResults.Find(delegate(ResultAttribute o) {
        return o.Name == assignment.Name;
    })) != null)
        attribute.Value = assignment.Value;
    }

誰でも私を助けることができますか?

4

2 に答える 2

7

やるべきことは、プロジェクト C# でメソッドをコンパイルし、それがReflectorを使用して生成するアセンブリ内の IL を確認することです。Emit を使用してその IL を簡単に複製し、必要な動的変更を加えることができます。

于 2009-10-01T09:40:46.550 に答える
1

匿名メソッド本体で代入変数を参照するため(この場合はパラメーターですが、これは問題ではありません)、クロージャーを作成します(慣れていない場合はウィキペディアを参照してください)。

匿名デリゲートのクラス ホルダーを作成する必要があります (少なくとも C# コンパイラはこれを行います)。

次に、デリゲートの閉鎖以来、このクラスにフィールドを作成する必要があります(私は英語が母国語ではないため、ここではスペルが間違っている可能性があります)割り当て割り当てパラメーター

次に、AssignAttribute の本体で、クラスのインスタンス化 IL_0000: newobj instance void V24.Generated.Worker/'<>c__DisplayClass1'::.ctor() を発行する必要があります。

フィールド代入 IL_0008: stfld class [nviss]NViss.Assignment V24.Generated.Worker/'<>c__DisplayClass1'::assignment

ファイルの初期化がどこでも終了したため、ローカル変数へのアクセスがフィールドへのアクセスに置き換えられたことに注意してください

もう一度私の英語でごめんなさい

于 2009-10-01T11:15:42.757 に答える