通常、メソッドへの引数をできるだけ一般的なものにし、必要に応じて型を汎用として返し、答えがあまり明確ではない問題にぶつかったという方法論に従おうとします。一般的なインターフェイスコレクションを返すためのガイドライン
私のような構造に基づいて動作制御があります:2つのキーを供給、我々は戻ってオブジェクトのコレクションを取得するようにするため
IDictionary<string, IDictionary<string, IEnumerable<MyObject>>>
を。かなりストレートです。
辞書を変更するであろう任意のIDictionaryの方法は非サポート例外を投げるように私は)(クラスにそういうことだ
ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
、読み取り専用の辞書を持っています。
コントロールが動作する上で辞書が
ReadOnlyDictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<MyObject>>>
を返すMyObjectRepositoryから出てくるので、質問は、私は返すように私のリポジトリ上の戻り値の型を更新する必要があり、ある
IDictionary<string, IDictionary<string, IEnumerable<MyObject>>>
か...?私は、読み取り専用ディクショナリを取るためにメソッドを更新することが不必要に制限されるので正しいとは思わない。
これは、戻り値の型が明確ではないようです。また、インターフェイスは、実装クラスが変更を許可する辞書を返すことができないように、戻り値の型としてReadOnlyDictionaryを定義します。インターフェイスが読み込み専用であるコレクションを返している場合は、戻り値の型に反映されるように感じられます。 generic IDictionary < ...>戻り値の型を指定することにより、インタフェースを使用するメソッドは、NotSupportedExceptionを実行するためだけに辞書を変更しようとする可能性があります。
これを解決する方法についてのご意見はありがとうございます。
更新 ここで実際の問題はReadOnlyCollectionです。これは単にIEnumerableに置き換える必要があり、さまざまな戻り値の型間での作業変換を単純化します。
ReadOnlyCollection or IEnumerable for exposing member collections?を参照し、Jon Skeetの回答に気付くこと。 ReadOnlyDictionaryはIDictionaryを<を実装しているため、
>が、サポートされていない操作上の例外をスローし、私はその最も簡単な推薦:これは私がSO好きな理由
私はこの答えの柔軟性が好きです。そして、それは、私たちが投げるメソッドを持つlinq、nullを返すメソッド、空を返すメソッドがあるようです。アイデアありがとう – MPavlak