将对象集合转换为IEnumerable(类型)

时间:2012-08-29 09:57:29

标签: .net casting

我的app.config中有一个ConfigurationSection,其中包含一个http端点列表(~50)。每个都有一个可选的优先级(以及默认值)。

我想按顺序显示此列表。

Dim Config As MyConfigSection = DirectCast(System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None).Sections("MySection"), MyConfigSection)
Dim Endpoints = MyConfigSection.InitialEndpoints

在这种情况下,InitialEndpoints的类型为Endpointcollection,它继承ConfigurationElementCollection,只是一个松散类型的noddy集合。

Endpoint集合恰好处理EndpointDefinition s而UrlPriority等......

我希望能够......

For Each E in Endpoints.OrderBy(function(x) x.Priority)
    ...
Next

我是否真的需要创建一个新的列表/集合并将对象传输过来,然后像我一样投射它们?

作为IEnumerable作弊和转换集合导致无效演员阵容(并非完全出乎意料)

另一种想法是做一些像......

Endpoints.Select(function(x) DirectCast(x, Endpointdefinition)).OrderBy(...)

但是EndpointCollection不是列表,因此不会从LINQ Select()扩展中受益。我总是可以实现IList,但现在感觉我正在使用大锤来破解坚果。

有人可以指出明显的方法吗?作为参考,我的EndpointCollection低于

<ConfigurationCollection(GetType(EndpointDefinition), AddItemName:="Endpoint")>
    Public Class EndpointCollection
        Inherits ConfigurationElementCollection

        Protected Overloads Overrides Function CreateNewElement() As ConfigurationElement
            Return New EndpointDefinition
        End Function

        Protected Overrides Function CreateNewElement(elementName As String) As ConfigurationElement
            Return New EndpointDefinition With {.Url = elementName}
        End Function

        Protected Overrides Function GetElementKey(element As ConfigurationElement) As Object
            Return DirectCast(element, EndpointDefinition).Url
        End Function

        Public Overrides ReadOnly Property CollectionType As ConfigurationElementCollectionType
            Get
                Return ConfigurationElementCollectionType.AddRemoveClearMap
            End Get
        End Property

        Public Shadows Property Item(index As Integer) As EndpointDefinition
            Get
                Return CType(BaseGet(index), EndpointDefinition)
            End Get
            Set(value As EndpointDefinition)
                If Not (BaseGet(index) Is Nothing) Then
                    BaseRemoveAt(index)
                End If
                BaseAdd(index, value)
            End Set
        End Property
    End Class

1 个答案:

答案 0 :(得分:3)

您的问题是,您的班级实施IEnumerable,而不是IEnumerable(Of T)

由于EndpointCollection继承ConfigurationElementCollectionConfigurationElementCollection实施IEnumerable,您可以使用OfType()扩展方法(或Cast(),如果您需要)。

所以你应该能够做到以下几点:

Dim Endpoints = MyConfigSection.InitialEndpoints.OfType(Of Endpointdefinition).OrderBy(function(x) x.Priority)

Dim Endpoints = MyConfigSection.InitialEndpoints.Cast(Of Endpointdefinition).OrderBy(function(x) x.Priority)