2010-10-06 1 views
1

У меня есть универсальный класс, который реализует IListDual счетчиков, вторые один посредством столкновений Интерфейс- типа по реализации

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

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

} 

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

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

Я пытался имея IListBase осуществить свою специфическую Enumerator:

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

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

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

Любых рекомендаций по добавлению этого вторичного нумератора так они не сталкиваются друг с другом?

ответ

0

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

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

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

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

Короче:

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

Марк, я не совсем уверен, почему, но когда я добавляю метод (или свойство, как вы здесь), который возвращает IEnumerable , компилятор жалуется на IEnumerable не содержит метод GetEnumerator() ... не уверен, что происходит? –

+0

Сообщение, подобное этому * обычно * означает, что я выбрал неверную опцию в resharper, и он создал тип * new * где-то (вместо добавления правильной директивы using) ... возможно, вы захотите дважды проверить это? –

+0

Я действительно закончил добавление небольшого класса, который выводит IEnumerable и теперь возвращаю его из вызова метода. Не красиво, но, похоже, работает. Спасибо за помощь! –