2

アプリ用の小さなパブ/サブ システムを作成しました。

IHandle を実装してメッセージを購読する

サブスクライバーが実装しているとしましょうIHandle<IEnumerable<MyType>>

次に、誰かがタイプのメッセージを公開しますICollection<MyType>>。IColletion<> はタイプ 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>

4

1 に答える 1

3

回避する必要がないように、反変IHandleとして定義する必要があります。

interface IHandle<in T>

このようにして、IEnumerable から継承するすべての型を受け入れます。

このリンクでは、共分散と反分散がジェネリックでどのように機能するかについて詳しく説明されています

于 2012-09-21T10:26:50.463 に答える