0

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するタイプであり、大まかにタイプされた単なるうなずきコレクションです。EndpointcollectionConfigurationElementCollection

エンドポイントコレクションは、、などを含むsを処理しEndpointDefinitionます。UrlPriority

できるようになりたい...

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

本当に新しいリスト/コレクションを作成してオブジェクトを転送し、キャストする必要がありますか?

コレクションを不正行為してキャストすると、IEnumerableキャストが無効になりました(まったく予期しないことではありません)

別の考えは、次のようなことをすることでした...

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

ただしEndpointCollection、これはリストではないため、LINQSelect()拡張機能のメリットはありません。いつでも実装でき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
4

1 に答える 1

3

ここでの問題は、クラスがを実装するIEnumerableのではなく、を実装することIEnumerable(Of T)です。

EndpointCollectionを継承ConfigurationElementCollectionしてConfigurationElementCollection実装するためIEnumerableOfType()拡張メソッド(または必要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)
于 2012-08-29T10:04:41.953 に答える