1

我有一个实现 IList 的通用类

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

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

}

IListBase 是一个接口,用于在运行时不知道 T 类型的情况下访问此类上的方法。

我需要通过这个 IListBase 接口实现第二个 Enumerator,它将迭代我的类的成员并将它们转换为所有成员都将实现的基本类型。

我试过让 IListBase 实现我的特定枚举器:

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

但这会因为 T 和 MemberBaseType 在某些情况下可能是相同的事实而崩溃。即使将枚举器成员添加到接口然后使用显式声明也无助于解决这个问题。

然后我尝试添加另一种方法来调用仅获取特定的 IEnumerator,但编译器随后抱怨找不到与此类型一起使用的公共 GetEnumerator 方法...

有什么建议可以添加这个辅助枚举器,以免它们相互冲突吗?

4

1 回答 1

0

在同一级别有两个做不同事情的枚举器是(IMO)一个坏主意。您可能可以强制它,但是一旦有人转换您的类型(特别是如果转换为非泛型接口),他们将得到的很大程度上是猜测。

我建议(而不是)通过属性提供它,例如.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;}
}
于 2010-10-06T06:29:43.253 回答