2013-07-25 84 views
2

在我的接口中,通常有一個IList<ISomeType>來表示List類型成員 並且說我期望支持Add方法的實現。IList在接口中,實現列表

但是在接口的實現,有一個

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)); 

但是,這看起來並不像是非常直接的,因爲它反轉了正在做的事情。 (該行動是在要添加的項目上,而不是在列表上)。

有什麼比這更好的?可能的事情可以在列表上完成?

回答

5

的AddRange是不是IList中方法,但是添加的,所以你可以很容易地擴展方法:

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

你也可以在如果列表實際上是表的一個實例,你的擴展方法檢查中你可以直接撥打AddRange

+0

擴展方法是最初的一個選項。但它並沒有解決潛在的問題。我應該真的使用列表而不是當我想說的是:「應該有一個添加方法」? –

+1

IList 有一個Add方法 - 它只是沒有AddRange方法 - 如果你想明確它,你可以創建自己的接口,它繼承自IList 並且有你想要的方法,但是你會必須從你的問題中創建你自己的包裝類 - 似乎不值得 - 它看起來像你想爲你自己的代碼方便的AddRange方法,而不是一個庫,因此建議擴展方法。 –

0

可能作出了一個由Martin提出的擴展方法,但這可能會破壞東西。

爲什麼人們使用界面?表達公共合同。現在這個合同是在.NET BCL框架中。如果您將代碼暴露給外部方,則還必須公開擴展方法,並確保人們將using語句添加到擴展名所在的文件中。這可能會導致編譯時錯誤(類似於AddRange方法可用於IList<T>)。

另外擴展方法剎車Liskov substitution原則(替代超級類型與基本類型)。

因此,如果您只在方法中使用List<T>,您可以輕鬆將IList<T>更改爲List<T>

+0

你說得對,擴展方法打斷LSP,但我不想每次都施放。並且在界面上有一個像列表這樣的具體類型時,我只是想說「可以添加的數組」,似乎也不是正確的方式。 –

+0

如果你只是需要'添加'考慮使用['ICollection '](http://msdn.microsoft.com/en-us/library/92t2ye13.aspx) – oleksii

+0

這仍然會在劇組結束,或不? –