簡體   English   中英

接口中的IList,實現中的List

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM