2

私のインターフェイスには、通常、IList<ISomeType>リスト型のメンバーを表し、Addメソッドをサポートする実装を期待していると言う があります。

しかし、インターフェースの実装には、

IList<ISomeType> = new List<ISomeType>()

リストを使用するたびに、たとえばキャストする必要があります

(this.MyList as List<IMyType>).AddRange(someType.ToList());

これを行うより良い方法はありますか?このキャストを回避するには?

- 編集して詳細情報を求める -

拡張メソッドの代わりに、それを解決するための小さな linq 式はありますか?

IList<string> list = new List<string>();
var items = new[] { "1", "2", "3" };
items.ToList().ForEach(x => list.Add(x));

しかし、これは行われていることを逆にするため、非常に簡単なことのようには見えません。(アクションは、リストではなく、追加するアイテムに対して行われます)。

それよりも良いものはありますか?リストで実行できる可能性のあることはありますか?

4

2 に答える 2

5

AddRange は IList のメソッドではありませんが、Add はそうであるため、拡張メソッドを簡単に作成できます。

public static void AddRange<T>(this IList<T> list, IEnumerable<T> values) {
    foreach(var value in values)
        list.Add(value);
}

リストが実際に List のインスタンスであるかどうかを拡張メソッドで確認することもできます。その場合、 AddRange を直接呼び出すことができます

于 2013-07-25T09:29:47.420 に答える
0

Martin によって提案された拡張メソッドを作成することもできますが、これにより問題が発生する可能性があります。

なぜ人々はインターフェイスを使うのですか? 公約を表明する。現在、このコントラクトは .NET BCL フレームワークにあります。コードを外部に公開する場合は、拡張メソッドも公開し、拡張using機能があるファイルに人々がステートメントを追加するようにする必要があります。これにより、コンパイル時エラーが発生する可能性があります ( 「 No AddRangemethod available in the IList<T>のようなもの)。

さらに、拡張メソッドは、Liskov 置換の原則 (基本型でスーパー型を置き換える) にブレーキをかけます。

したがってList<T>、メソッドでのみ使用する場合は、簡単に に変更できIList<T>ますList<T>

于 2013-07-25T09:43:42.137 に答える