2012-03-08 2 views
-1

Мы хотим стрелять события, с именами событий, сохраненных в SQL ServerGeneric EventAggregator?

В SQL Server вы найдете ApplicationExitRequestEvent Когда мы нажимаем на кнопку меню, мы получим строку из MenuItem

Type t = Type.GetType(SelectedMenu.View + "," + "AssemblyName"); 
var obj = Activator.CreateInstance(t); 

if (t != null) 
{ 
//Working firing Event with className 
EventAggregator.GetEvent<ApplicationExitRequestEvent>().Publish(null); 

//Generic? 
EventAggregator.GetEvent<???>().Publish(null); 
} 

Ist это можно сделать? Работа с PRISM и MVVM - WPF - .NET 4.0

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method) о том, как вызвать общий метод с использованием отражения. Вероятно, это не самая лучшая практика, хотя, если производительность является проблемой. –

+0

thx. 'MethodInfo method = EventAggregator.GetType(). GetMethod (" GetEvent "); MethodInfo generic = method.MakeGenericMethod (typeof (ApplicationExitRequestEvent)); generic.Invoke (это, null); ' Не работает. Есть идеи? –

+0

Объект не равен целевому объекту ?! –

ответ

0

, если вы посмотрите на класс EventAggregator, вы увидите, что нет ничего более, чем контейнер Dictionary<Type, EventBase> и метод GetEvent. Вот и все, вся работа выполнена в EventBase. Чтобы достичь желаемого, вы можете изменить класс (или сделать копию и изменить его) и добавить метод GetEvent(string typeString), в котором вы преобразуете типString в фактический Type (так же, как в примере кода), и используйте это для извлечения события из словаря.

+0

Как изменить класс? –

+0

получить исходный код по адресу http://compositewpf.codeplex.com/SourceControl/list/changesets и начать вводить:] – stijn

0

Получил это, работая сейчас! развалюха Призма Library, чтобы получить событие по типу :-)

/// <summary> 
    /// Gets the single instance of the event managed by this EventAggregator. 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")] 
    public CompositePresentationEvent<object> GetEvent(Type type) 
    { 
     EventBase existingEvent = null; 
     events.TryGetValue(type, out existingEvent); 

     if(existingEvent != null) 
      return (CompositePresentationEvent<object>)existingEvent; 

     return null; 
    } 

Спасибо, ребята!