2015-10-08 63 views
1

我遇到一個問題訂閱與事件聚合器來作爲棱鏡框架的一部分。棱鏡 - EventAggregator.GetEvent <>。訂閱() - 使用泛型和Contraints

如果我使用的東西,如

eventAggregator.GetEvent<string>().Subscribe(MyMethod) 

那麼這一切工作正常,當事件已經發表我的方法火災。

但是,當移動到比I字符串更復雜的對象時,我遇到了問題。

我有一大堆的所有從接口(IRequest)獲得例如

類我有我的事件類的設置如下

public class MyEvent<TRequest> : PubSubEvent<MyClass<TRequest>> where TRequest : IRequest {} 

我有一個泛型類(MyClass的)使用IRequest的一個對象 - 在這一點上似乎都可以正常工作。

現在,可以說我發佈使用對象個人資料裏面的MyClass的事件:

eventAggregator.GetEvent<MyEvent<Profile>>().Publish(myProfileObject); 

在我簽約,我想能趕上MyEvent的所有事件的方法 - 不相關的T是否是配置文件或從IRequest派生的其他對象 - 這是我似乎遇到問題的地方。

在下面的例子中,第一個作品,但第二個作品 - 我理想上喜歡使用類似於第二個的東西。

eventAggregator.GetEvent<MyEvent<Profile>>().Subscribe(test1); 
void test1 (MyClass<Profile> obj) 
{ 
    //Some stuff here 
} 

eventAggregator.GetEvent<MyEvent<IRequest>>().Subscribe(test2); 
void test2<T>(MyClass<T> obj) where T : IRequest 
{ 
    //never gets called 
} 

我的假設是,因爲配置文件派生自IRequest,那麼它應該工作?但它不!

任何幫助,將不勝感激。

UPDATE
如果我用下面的,它的工作,但需要我創建一個單獨的認購提供每種類型IRequest的 - 我期待只有一個訂閱。

eventAggregator.GetEvent<MyEvent<Profile>>().Subscribe(test2); 
eventAggregator.GetEvent<MyEvent<User>>().Subscribe(test2); 
+0

嘿。我認爲你的問題表明了努力,但是你可以通過預先準備一份剝離樣本的完整副本粘貼樣本+使用nuget引用來激勵像我這樣的懶惰人。有時在準備時,你也會發現它不工作的原因(至少我已經做了幾次) – Dbl

+0

@AndreasMüller - 謝謝,未來會嘗試添加額外的鏈接/引用等 - 儘管在這實例中,我使用的代碼更加複雜,因此試圖在簡化所有相關信息的同時提供相關信息 –

回答

2

MyEvent<IRequest>MyEvent<Profile>是不一樣的,所以EventAggregator不認爲這是同一事件確實。爲了允許協變類型,你可以用修飾符在C#中修復4.像這樣的東西應該工作:

public interface IMyClass<out T> where T : IRequest { } 

public class MyClass<T> : IMyClass<T> where T : IRequest { } 

public class MyEvent<TValue> : PubSubEvent<IMyClass<TValue>> where TValue : IRequest { } 

那麼你的事件聚合器看起來是這樣的:

_eventAggregator.GetEvent<MyEvent<IRequest>>().Subscribe(Received); 

private void Received(IMyClass<IRequest> obj) 
{ 

} 

_eventAggregator.GetEvent<MyEvent<IRequest>>().Publish(new MyClass<Profile>()); 

不這有幫助嗎?