2009-09-23 2 views
6

Предположим, что у меня есть класс TestCollection, который используется для хранения объектов типа испытания и определяется какДобавление IEnumerable <T> в класс, производный от CollectionBase

public class TestCollection : CollectionBase 

Это позволяет мне перебирать коллекции либо как

foreach(object o in collection) 
... 

или

foreach(Test t in collection) 

, но не позволяет мне нужно использовать новые запросы Linq.

Если изменить определение класса к

public class TestCollection : CollectionBase, IEnumerable<Test> 

и добавить метод

public new IEnumerator<Test> GetEnumerator() 
{ 
    foreach (Test o in this.List) 
     yield return o ; 
} 

затем Linq запросы доступны.

Однако этот новый метод не только призывает к Linq запросов, но также называется в унаследованном коде (т.е. во время Еогеаспа (объект O в коллекции) и Еогеасп (Test в коллекции).

Есть ли разница между старым способом итерации через коллекцию и этим новым способом, предполагая, что все элементы в коллекции имеют тип Test? Я знаю, что добавление метода IEnumerator приведет к тому, что программа выкинет исключение, если найдет какие-либо другие типы, кроме Test , но хочу знать, не упустил ли я что-либо.

ответ

2

Нет, вы увидите идентичные результаты и получите только один дополнительный уровень косвенности (так как новый метод GetEnumerator просто вызывает существующий метод GetEnumerator и передает его выход).

0

IEnumerator<T>, скомпилированный из итератора, не реализует метод Reset. EDIT: Я имею в виду, что он бросит NotImplementedException.

В этом нет ничего плохого, но если вы хотите использовать метод Reset, вам придется написать собственный класс итератора, что не сложно.

+1

Нет; он * реализует * это - как бросание «NotImplementedException». Для этой цели подходят блоки итераторов. –

+0

Вот что я имел в виду. – SLaks

13

Поскольку вы находитесь в 2.0 (или выше), возможно, просто наследуете от Collection<T>?

public class TestCollection : Collection<Test> { 
    // your extra code here 
} 

Тогда вы получите IList<T>, ICollection<T>, IEnumerable<T> бесплатно и virtual методы, которые вы можете override поставить свой отпечаток на поведение.

+0

+1 Это тоже хорошая идея. –

+0

+1 .. я согласен с этим. –

+2

Изменение базового типа является нарушением изменений - если класс уже отправлен, это не должно быть сделано. – SLaks

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