[英]IList in interface, List in implementation
在我的界面中,通常有一個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));
但是,這看起來不那么直截了當,因為它使正在做的事情變得反過來。 (操作是在要添加的項目上,而不是列表上)。
有什么比這更好的了嗎? 可以在清單上做些什么?
AddRange不是IList上的方法,但是Add是,因此您可以輕松地創建擴展方法:
public static void AddRange<T>(this IList<T> list, IEnumerable<T> values) {
foreach(var value in values)
list.Add(value);
}
您還可以在擴展方法中檢查list是否實際上是List的實例,在這種情況下,您可以直接調用AddRange
您可以提出Martin建議的擴展方法,但這可能會破壞東西。
人們為什么要使用界面? 表達公共合同。 現在,此合同位於.NET BCL框架中。 如果曾經向外部用戶公開代碼,則還必須公開擴展方法,並確保人們在擴展名所在的文件中添加using
語句。 這可能會導致編譯時錯誤(類似於“ IList<T>
沒有可用的AddRange
方法”之類的東西 )。
此外,擴展方法還打破了Liskov替換原理(用基本類型替換超級類型)。
因此,如果僅在方法中使用List<T>
,則可以輕松地將IList<T>
更改為List<T>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.