Двойные перечислители, вторые через конфликты типа интерфейса при реализации - PullRequest
1 голос
/ 06 октября 2010

У меня есть универсальный класс, который реализует IList

public class ListBase<T>: IList<T>, IListBase{

   IEnumerator<T> GetEnumerator(){ ....
   System.Collections.IEnumerator GetEnumerator(){ return GetEnumerator();}

}

IListBase - это интерфейс, который я использую для доступа к методам этого класса в тех случаях, когда я не знаю тип T во время выполнения.

Мне нужно реализовать второй перечислитель через этот интерфейс IListBase, который будет перебирать членов моего класса и возвращать их приведение в качестве базового типа, который будут реализованы всеми членами.

Я пытался, чтобы IListBase реализовал мой конкретный перечислитель:

public interface IListBase: IEnumerable<MemberBaseType> { ....

Но это взрывается из-за того, что T и MemberBaseType могут быть одинаковыми в некоторых случаях. Даже добавление членов перечислителя в интерфейс и последующее использование явных объявлений не поможет в решении этой проблемы.

Затем я попытался добавить другой метод для вызова только для получения определенного IEnumerator, но затем компилятор жалуется, что не нашел общедоступный метод GetEnumerator для использования с этим типом ...

Какие-либо рекомендации по добавлению этого вторичного перечислителя, чтобы они не сталкивались друг с другом?

1 Ответ

0 голосов
/ 06 октября 2010

Наличие двух перечислителей на одном уровне , которые делают разные вещи, - (ИМО) плохая идея.Вы, вероятно, можете заставить его, но как только кто-то произнесет ваш тип (особенно если приведен к неуниверсальному интерфейсу), это будет в значительной степени догадка, которую он получит.

Я бы порекомендовал (вместо этого) сделать это доступным через свойство, например .Members, где .Members предлагает это перечисление.Тогда нет двусмысленности намерений и нет несчастья компилятора.Таким образом, я мог бы использовать:

foreach(var member in list.Members) { /* add columns */ }
foreach(var item in list) { /* add rows */ }

Вы также можете рассмотреть ITypedList, который может иметь некоторую привязку здесь, особенно если вы хотите привязать данные к своему списку (это не обязательно, если Tсам по себе все определяет чисто).

Короче:

public interface IListBase {
    IEnumerable<MemberBaseType> Members {get;}
}
...