2012-09-21 89 views
2

我已經寫了一個小的pub/sub系統爲我們的應用程序,IEnumerable的<T>等於ICollection的<T>類型檢查

你通過實施IHandle

訂閱的消息可以說讓用戶實現IHandle<IEnumerable<MyType>>

然後有人發佈類型爲ICollection<MyType>>的消息,因爲IColletion是類型IEnumerable,所以這應該會引發訂閱者,因爲它是類型IEnumerable <>

但我的代碼不支持這一點,解決方法是發佈者將ICollection投入到IEnumerable中,但它容易出現大型團隊中的錯誤。

這是行不通

public void Publish<T>(T message) where T : class 
{ 
    if (config.EnableEventAggregator) 
     subscribers.OfType<IHandle<T>>() 
     .ForEach(s => s.Handle(message)); 
} 

的代碼,我希望它找到IHandle<IEnumerable>爲繼承IEnumerable<T> 任何想法各類?

+2

Cuong Le是正確的。還有1)你的方法的主體可能被替換爲以下行:'return subscribers.OfType >();',2)這些問題與反射無關,所以我要去除標記。 – thorn

+0

作出了一個答案它 – Anders

回答

3

您需要定義IHandle禁忌變,這樣你就不需要解決:

interface IHandle<in T> 

有了這樣一來就會接受其自IEnumerable

這繼承了所有類型link詳細解釋了協方差和反方差如何與genric一起工作

+0

逆變,doh,offcourse,謝謝兄弟! – Anders

相關問題