2010-05-10 28 views
0

該任務是在運行時創建事件處理程序。我需要用不同事件的不同參數值調用這個方法。事件和它們的編號只在運行時才知道。所以我試圖生成動態方法,每個方法都會分配給某個事件,但通常它們只是將一些值傳遞給實例方法並調用它。如何在訂閱事件時傳遞值並在事件觸發時獲取它(DynamicMethod使用問題)

如果類似的事情能夠以更簡單的方式完成,那將會很棒。我的意思是在訂閱階段傳遞一些價值,然後在事件觸發時獲得它。

這就是我想現在要做的:

public class EventSource 
{ 
    public event EventHandler eventOne; 
    public event EventHandler eventTwO; 
    public event EventHandler eventThree; 
} 

public class EventListener 
{ 
    SubscribeForEvents() 
    { 
     BindingFlags flags = 
        BindingFlags.IgnoreCase | 
        BindingFlags.Public | 
        BindingFlags.Instance; 

     // Suppose we've already got EventInfo 
     // and target source somewhere 
     // so we can do eventInfo.AddEventHandler(target, delegate) 
     // Now we need a delegate. 

     int value = 42; 
     Type tDelegate = eventInfo.EventHandlerType; 

     // http://msdn.microsoft.com/en-us/library/ms228976(VS.95).aspx 
     Type returnType = GetDelegateReturnType(tDelegate); 
     DynamicMethod listener = new DynamicMethod("", null, 
      GetDelegateParameterTypes(tDelegate), this.GetType()); 
     ///////// 

     Type[] callParameters = { typeof(int) }; 
     MethodInfo method = this.GetType().GetMethod("ToCallFromDelegate", flags); 
     ILGenerator generator = listener.GetILGenerator(); 

     // No success in this mess. What's wrong? 
     generator.Emit(OpCodes.Ldc_I4, value); 
     generator.Emit(OpCodes.Call, method); 
     generator.Emit(OpCodes.Pop); 
     generator.Emit(OpCodes.Ret); 
     ///////////// 

     Delegate delegate = listener.CreateDelegate(tDelegate); 
     eventInfo.AddEventHandler(target, delegate); 

     // When triggered, there is InvalidProgramException 
    } 

    void ToCallFromDelegate(int value) 
    { 
     doSomething(); 
    } 
} 

回答

0

Lambda表達式作爲事件處理程序;)

相關問題