2009-07-13 12 views
0

私の 'my​​Class'クラスでは、Reflection.Emitを使用してmyClassクラスのメンバーの1つにイベントハンドラを動的に記述しています。動的イベントハンドラで 'this'を参照してください

私はこれを成功させました。

ここで、myClassクラスのインスタンスメソッドの1つを呼び出すように、イベントハンドラを変更します。

しかし、Reflection.Emitを使用してMSILスタックに 'this'への参照をプッシュする方法を理解できません。イベントハンドラ内では、Ldarg_0は 'this'への参照ではなく、イベントハンドラの最初のパラメータです。

私はインスタンスメソッドを呼び出すことができるように誰もスタック上の 'this'への参照をプッシュする方法を知っていますか?たとえば、これはC#コードのようになります:

public class myClass 
{ 
private myObj1 obj1; 
public myClass() { 
    this.init(); 
} 

private void init() 
{ 
    obj1.myEvent += new myEvent_EventHandler(theHandler); 
} 

private void theHandler(myObj2 obj2, myObj3 obj3) 
{ 
    // this is the part I'm having trouble with 
    this.myFunction(obj2); 
} 

private void myFunction(myObj2 obj2) 
{ 
    // irrelevant 
} 
} 

ありがとう!

+0

"Main"と言うとき、プログラムを起動する実際のクラスまたは 'static void main'メソッドを参照していますか? Jakersの答えに基づく混乱があるようです。 – jasonh

+0

申し訳ございませんが、選択されていません。私は改訂します – emrosenf

+0

静的メソッドからインスタンスメソッドを呼び出すインスタンスは存在しないので、インスタンスメソッドを呼び出すことはできません。 –

答えて

3

あなたがReflection.Emitを使用して(と私はここにDynamicMethodを想定しています)、あなたは、生成されたコードの最初の引数がどうなるかを選択するために取得、それはこのように、デリゲートによって暗黙的に渡すことができます。

using System; 
using System.Reflection.Emit; 

public class App 
{ 
    static void Main() 
    { 
     DynamicMethod m = new DynamicMethod("test", typeof(void), 
      new[] { typeof(App), // <-- type of first argument, your choice 
       typeof(string) }); 

     var cg = m.GetILGenerator(); 

     cg.Emit(OpCodes.Ldarg_0); 
     cg.Emit(OpCodes.Ldarg_1); 
     cg.EmitCall(OpCodes.Call, 
      typeof(App).GetMethod("ShowString"), null); 

     cg.Emit(OpCodes.Ret); 

     Action<string> d = (Action<string>) 
      m.CreateDelegate(typeof(Action<string>), 
      new App()); // <-- this is the first argument, *your* choice 

     MyEvent += d; 

     // Trigger event 
     MyEvent("Hello there"); 
    } 

    static event Action<string> MyEvent; 

    public void ShowString(string s) 
    { 
     Console.WriteLine(s); 
    } 
} 
+0

これは完璧な答えでした!どうもありがとうございます! – emrosenf

3

メインにいる場合、メインクラスのインスタンスはありません。主な機能は静的です。

+0

申し訳ありませんが、私は意味していません – emrosenf

関連する問題