2012-02-16 9 views
0

通常、メソッドへの引数をできるだけ一般的なものにし、必要に応じて型を汎用として返し、答えがあまり明確ではない問題にぶつかったという方法論に従おうとします。一般的なインターフェイスコレクションを返すためのガイドライン

私のような構造に基づいて動作制御があります: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好きな理由

答えて

1

私の考えは、インタフェース:DoubleKeyLookup<out ValT>を定義することであり、その由来はDoubleKeyLookup<in KeyT1, in KeyT2, out ValT>です。最初のメソッドはGetSequence(Object key1, Object key2);TryGetSequenceGetSequenceOrEmptyのようなメソッドを持ちます(前者は見つからないため、後者はnull、後者はEnumerable<ValT>.Empty)。 2つ目は同様ですが、指定された型の 'key'パラメータを使用します。ほとんどの消費者はおそらく2番目を使用しますが、1番目は消費者が望む場合に使用可能です。特定のAnimalがすべてのキーがCatの辞書に含まれていたかどうかを確認してください。

+0

私はこの答えの柔軟性が好きです。そして、それは、私たちが投げるメソッドを持つlinq、nullを返すメソッド、空を返すメソッドがあるようです。アイデアありがとう – MPavlak

1

:)私は考えることができる最も簡単かつユーザーフレンドリーな方法がされていますReadOnlyDictionary <、>はIReadOnlyDictionary <、>を実装して返します。 IReadOnlyDictionary <、>はIDictionary <から機能的に同等であるため、>から派生します。

メソッドプロトタイプの名前 "IReadonlyDictionary"は、辞書を変更するメソッドが機能しない可能性があることを呼び出し側に示します。

希望すると便利です。

+0

私は両方の答えが好きで、おそらくより単純なプロジェクトにこれを使用します。 – MPavlak

関連する問題