2012-03-08 102 views
-1

我們要觸發事件,與保存在SQL Server通用EventAggregator?

在SQL Server,你會發現ApplicationExitRequestEvent 事件名稱當我們點擊菜單鍵,我們將從菜單項

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); 
} 
得到字符串

我可以做嗎? 使用PRISM和MVVM - WPF - .NET 4.0

+0

請參閱[此問題](http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-generic-method)瞭解如何使用反射調用通用方法。儘管性能是一個問題,但這可能不是最佳做法。 – 2012-03-08 10:01:42

+0

thx。 'MethodInfo method = EventAggregator.GetType()。GetMethod(「GetEvent」); MethodInfo generic = method.MakeGenericMethod(typeof(ApplicationExitRequestEvent)); generic.Invoke(this,null);' 不起作用。任何想法? – 2012-03-08 14:53:07

+0

對象不等於目標對象?! – 2012-03-08 15:06:51

回答

0

如果你看EventAggregator類,你會發現它只不過是一個容器Dictionary<Type, EventBase>GetEvent方法。就是這樣,所有的實際工作都在EventBase完成。爲了實現你想要的,你可以修改這個類(或者複製並修改它),然後添加一個方法GetEvent(string typeString),其中你將typeString轉換爲實際的Type(與你的代碼示例中的方式相同)並使用它從字典中獲取事件。

+0

如何修改類? – 2012-03-08 15:04:09

+0

從http://compositewpf.codeplex.com/SourceControl/list/changesets獲取源代碼並開始鍵入:] – stijn 2012-03-08 15:14:28

0

知道了,現在工作正常! 拉皮條棱鏡庫,由類型獲取事件:-)

/// <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; 
    } 

謝謝你們!