2015-05-17 3 views
0

Я пытаюсь вызвать EventAggregator Prism с помощью отражения, потому что полезная нагрузка события определяется во время выполнения.Недопустимый аргумент при вызове метода через отражение

Вот нормальный способ использовать EventAggregator:

 [TestMethod] 
    public void WhenEventIsPublishedTheSubscriberReceivesIt() 
    { 
     var eventAggregator = new EventAggregator(); 

     eventAggregator.GetEvent<PubSubEvent<string>>().Subscribe(Subscription); 
     eventAggregator.GetEvent<PubSubEvent<string>>().Publish(Constants.TestSymbol); 

     Assert.IsTrue(this.subscriptionReceived); 
    } 

    private void Subscription(string data) 
    { 
     this.subscriptionReceived = true; 
    } 

Я делаю это:

  var commandHandlerLocator = this.container.Resolve<ICommandHandlerLocator>(); 

     var t = command.GetType(); 

     dynamic commandHandler = commandHandlerLocator.GetType() 
      .GetMethod("GetCommandHandler") 
       .MakeGenericMethod(command.GetType()).Invoke(commandHandlerLocator, null); 

     IEnumerable<IEvent> events = commandHandler.Execute(command); 

     foreach (var @event in events) 
     { 
      var typedEvent = typeof(PubSubEvent<>).MakeGenericType(@event.GetType()); 

      dynamic pubSubEvent = this.eventAggregator.GetType() 
       .GetMethod("GetEvent") 
        .MakeGenericMethod(typedEvent).Invoke(this.eventAggregator, null); 

      pubSubEvent.Publish(@event); 
     } 

Here you see the the method and method argument variables

Выглядит хорошо для меня. Но когда я выполняю последнюю строку "(pubSubEvent.Publish (@event)", я получаю исключение, что метод Publish вызывается с недопустимыми аргументами. Любая идея, почему аргумент @event недействителен?

С уважением! .

ответ

0

Найден ответ мне нужно сильно ввести @event:

 private void Publish<T>(T @event) where T : IEvent 
    { 
     var eventAggregator = new EventAggregator(); 
     var pubSubEventType = typeof(PubSubEvent<>).MakeGenericType(typeof(T)); 

     dynamic pubSubEvent = eventAggregator.GetType() 
        .GetMethod("GetEvent") 
         .MakeGenericMethod(pubSubEventType).Invoke(eventAggregator, null); 

     pubSubEvent.Publish(@event); 
    } 
Смежные вопросы