2010-05-10 2 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

лямбды в качестве обработчиков событий;)