双枚举器,第二个通过接口类型冲突实现

时间:2010-10-06 06:11:32

标签: c# .net generics ienumerable ilist

我有一个实现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方法来使用这个类型......

有关添加此辅助枚举器的任何建议,以便它们不会相互冲突吗?

1 个答案:

答案 0 :(得分: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;}
}