我建议您首先创建函数 GetEnumeratorInFirstStyle、GetEnumeratorInSecondStyle 等(当然,使用适合您的应用程序的名称),然后创建类似的新结构(例如 vb 语法,但应该可以轻松转换为 C#):
类 enumTest
函数 GetEnumeratorInFirstStyle() As IEnumerator(Of Integer)
Return Enumerable.Empty(Of Integer)() ' 真正的代码会做得更好
结束功能
私有结构 FirstStyleEnumerable
实现 IEnumerable(Of Integer)
私有 myEnumTest 作为 enumTest
公共函数 GetEnumerator() As System.Collections.Generic.IEnumerator(Of Integer) 实现 System.Collections.Generic.IEnumerable(Of Integer).GetEnumerator
返回 myEnumTest.GetEnumeratorInFirstStyle
结束功能
公共函数 GetEnumerator1() 作为 System.Collections.IEnumerator 实现 System.Collections.IEnumerable.GetEnumerator
返回 myEnumTest.GetEnumeratorInFirstStyle
结束功能
Sub New(ByVal newEnumTest As enumTest)
myEnumTest = newEnumTest
结束子
末端结构
公共只读属性 AsFirstStyleEnumerable As IEnumerable(Of Integer)
得到
返回新的 FirstStyleEnumerable(Me)
结束获取
结束属性
结束类
请注意,使用的是结构而不是类,因为使用类需要创建一个新的堆对象并为其访问添加额外的间接级别;该结构的真正目的是允许它实现与封装对象“不同”的 IEnumerable<T>。顺便说一句,可以将泛型与标记类一起使用,以避免必须为枚举的每个变体手动定义一个新的 FirstStyleEnumerator 结构。不过,我不确定这是否会更清晰或更令人困惑。
接口 IQualifiedEnumerable(Of T, U)
函数 GetEnumerator() As IEnumerable(Of U)
端接口
结构 QualifiedEnumerableWrapper(Of T, U)
实现 IEnumerable(Of U)
Private myEnumerable As IQualifiedEnumerable(Of T, U)
公共函数 GetEnumerator() As System.Collections.Generic.IEnumerator(Of U) 实现 System.Collections.Generic.IEnumerable(Of U).GetEnumerator
返回 myEnumerable.GetEnumerator
结束功能
公共函数 GetEnumerator1() 作为 System.Collections.IEnumerator 实现 System.Collections.IEnumerable.GetEnumerator
返回 myEnumerable.GetEnumerator
结束功能
Sub New(ByVal newEnumerable As IQualifiedEnumerable(Of T, U))
myEnumerable = newEnumerable
结束子
末端结构
类 EnumTest2
实现 IQualifiedEnumerable(Of FirstEnumerationStyle, Integer)
实现 IQualifiedEnumerable(Of SecondEnumerationStyle, Integer)
Private Class FirstEnumerationStyle ' 泛型的标记类
结束类
私有类 SecondEnumerationStyle
结束类
私有函数 GetFirstStyleEnumerator() As System.Collections.Generic.IEnumerable(Of Integer) 实现 IQualifiedEnumerable(Of FirstEnumerationStyle, Integer).GetEnumerator
返回 Enumerable.Empty(Of Integer)()
结束功能
私有函数 GetSecondStyleEnumerator() As System.Collections.Generic.IEnumerable(Of Integer) 实现 IQualifiedEnumerable(Of SecondEnumerationStyle, Integer).GetEnumerator
返回 Enumerable.Empty(Of Integer)()
结束功能
公共只读属性 AsFirstStyleEnumerable As IEnumerable(Of Integer)
得到
返回新的 QualifiedEnumerableWrapper(Of FirstEnumerationStyle, Integer)
结束获取
结束属性
公共只读属性 AsSecondStyleEnumerable As IEnumerable(Of Integer)
得到
返回新的 QualifiedEnumerableWrapper(Of SecondEnumerationStyle, Integer)
结束获取
结束属性
结束类
这里,接口和结构的定义完全是通用的;将每个额外的枚举方法添加到类将需要添加一个函数来返回其枚举器,以及一个属性来返回适当类型的 QualifiedEnumerableWrapper。