我建議你先創建函數GetEnumeratorInFirstStyle,GetEnumeratorInSecondStyle等(當然使用適合你的應用的名字),然後創建一些新的結構(例如在vb語法中,但應該很容易轉換爲C#):
Class enumTest
Function GetEnumeratorInFirstStyle() As IEnumerator(Of Integer)
Return Enumerable.Empty(Of Integer)() ' Real code would do something better
End Function
Private Structure FirstStyleEnumerable
Implements IEnumerable(Of Integer)
Private myEnumTest As enumTest
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of Integer) Implements System.Collections.Generic.IEnumerable(Of Integer).GetEnumerator
Return myEnumTest.GetEnumeratorInFirstStyle
End Function
Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return myEnumTest.GetEnumeratorInFirstStyle
End Function
Sub New(ByVal newEnumTest As enumTest)
myEnumTest = newEnumTest
End Sub
End Structure
Public ReadOnly Property AsFirstStyleEnumerable As IEnumerable(Of Integer)
Get
Return New FirstStyleEnumerable(Me)
End Get
End Property
End Class
注意的結構而不是使用一個類,因爲使用類將需要創建一個新的堆對象,並添加間接到其接入額外的水平;該結構的真正目的是允許它從封裝對象實現「不同的」IEnumerable <T>。順便說一句,有可能使用具有標記類的泛型來避免爲每個枚舉變體手動定義一個新的FirstStyleEnumerator結構。不過,我不確定這是否會更乾淨或更混亂。
Interface IQualifiedEnumerable(Of T, U)
Function GetEnumerator() As IEnumerable(Of U)
End Interface
Structure QualifiedEnumerableWrapper(Of T, U)
Implements IEnumerable(Of U)
Private myEnumerable As IQualifiedEnumerable(Of T, U)
Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of U) Implements System.Collections.Generic.IEnumerable(Of U).GetEnumerator
Return myEnumerable.GetEnumerator
End Function
Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return myEnumerable.GetEnumerator
End Function
Sub New(ByVal newEnumerable As IQualifiedEnumerable(Of T, U))
myEnumerable = newEnumerable
End Sub
End Structure
Class EnumTest2
Implements IQualifiedEnumerable(Of FirstEnumerationStyle, Integer)
Implements IQualifiedEnumerable(Of SecondEnumerationStyle, Integer)
Private Class FirstEnumerationStyle ' Marker classes for generics
End Class
Private Class SecondEnumerationStyle
End Class
Private Function GetFirstStyleEnumerator() As System.Collections.Generic.IEnumerable(Of Integer) Implements IQualifiedEnumerable(Of FirstEnumerationStyle, Integer).GetEnumerator
Return Enumerable.Empty(Of Integer)()
End Function
Private Function GetSecondStyleEnumerator() As System.Collections.Generic.IEnumerable(Of Integer) Implements IQualifiedEnumerable(Of SecondEnumerationStyle, Integer).GetEnumerator
Return Enumerable.Empty(Of Integer)()
End Function
Public ReadOnly Property AsFirstStyleEnumerable As IEnumerable(Of Integer)
Get
Return New QualifiedEnumerableWrapper(Of FirstEnumerationStyle, Integer)
End Get
End Property
Public ReadOnly Property AsSecondStyleEnumerable As IEnumerable(Of Integer)
Get
Return New QualifiedEnumerableWrapper(Of SecondEnumerationStyle, Integer)
End Get
End Property
End Class
這裏,接口和結構的定義是完全通用的;將每個額外的枚舉方法添加到一個類中需要添加一個函數來返回它的枚舉器,並且需要一個屬性來返回適當類型的QualifiedEnumerableWrapper。
爲什麼downvote? – 2010-08-27 02:47:28