2013-07-25 3 views
2

В моих интерфейсах обычно есть IList<ISomeType> для представления членов типа списка и сказать, что я ожидаю реализацию, поддерживающую метод Add.IList in interface, Список в реализации

Но в реализации интерфейса, есть

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

Метод расширения определенно является опцией. Но это не решает основной проблемы. Должен ли я действительно использовать Список вместо этого, когда я хочу сказать: «должен быть метод Add»? –

+1

IList имеет метод Add - он просто не имеет метода AddRange - если вы хотите быть явным, вы можете создать свой собственный интерфейс, который наследует от IList и имеет метод, который вы хотите, но тогда вы бы должен создать свой собственный класс-оболочку - не похоже на это - с вашего вопроса кажется, что вы хотите использовать метод AddRange для своего собственного кода, а не для библиотеки, следовательно, предложение для метода расширения. –

0

может сделать метод расширения, предложенный Мартином, но это может сломать материал.

Почему люди используют интерфейс? Выразить публичный контракт. Теперь этот контракт заключен в платформе .NET BCL. Если вы когда-либо предоставляете код внешней стороне, вы должны также выставить метод расширения и убедиться, что люди добавляют оператор using в файл, в котором находится расширение. Это может привести к ошибке времени компиляции (что-то вроде «Нет AddRange метод доступен в IList<T>«).

Дополнительно метод расширения тормозов Liskov substitution принцип (замените супер тип с базовым типом).

Таким образом, если вы используете только методы List<T>, вы можете легко изменить IList<T> на List<T>.

+0

Вы правы, метод расширения ломает LSP, но я не хочу бросать каждый раз.И иметь конкретный тип типа List в интерфейсе, когда я просто говорю, что «есть массив, который может быть добавлен в», тоже не кажется правильным. –

+0

Если вам просто нужно «Добавить», подумайте об использовании ['ICollection '] (http://msdn.microsoft.com/en-us/library/92t2ye13.aspx) – oleksii

+0

, это все равно закончится приложением или нет? –

Смежные вопросы