2

わかりました、多分それは正確には方法ではありません。これが私がやりたいことです:

Private _Columns As ArrayList
Public Property Columns() As ArrayList
    Get
       Return _Columns
    End Get
    Set(Cols As ArrayList)
       _Columns = Cols
    End Set
    Set(Cols As MyOwnList)
       _Columns = New ArrayList
       For Each o As MyObj in Cols
          _Columns.Add(o.Column)
       Next
    End Set
End Property

これにより、さまざまな種類のコレクション型を割り当てることで、プロパティを便利に設定できるようになります...ただし、Setメソッドは明らかにプロパティ自体の型の引数を取らなければならないため、それを行うことはできません...苦情を受け取ります:

'Set' パラメーターは、それを含むプロパティと同じ型でなければなりません

これを行う方法はありますか?

4

2 に答える 2

3

それは実際には過負荷ではありませんが、以下は(一時的な)回避策を提供する可能性があります:

Private Cols As ArrayList
Public Property Columns() As ArrayList
    Get
        Return _Columns
    End Get
    Set(Cols As ArrayList)
        _Columns = Cols
    End Set
End Property

Public WriteOnly Property SpecializedColumns() As MyOwnList
    Set(value As MyOwnList)
        Dim list As New ArrayList
        For Each o As MyObj In value
            list.Add(o.Column)
        Next
        Columns = list
    End Set
End Property

これは、実際のオーバーロードされたプロパティにできるだけ近いと思います...

編集

あなたが達成しようとしていることを行う適切な方法は、クラスでToArrayList()メソッドを定義することだと思います。MyOwnList

Public Function ToArrayList()
    Dim list As New ArrayList

    For Each o As MyObj In Me.Items
        list.Add(o.Column)
    Next

    Return list
End Function

プロパティを次のように設定します。

    Columns = theMyOwnListObject.ToArrayList

クラスのソースコードにアクセスできない場合でも、拡張メソッドを使用してこれを実現できます。

于 2012-05-12T08:32:37.297 に答える
3

いいえ、自動プロパティでセッターが期待するパラメーターのタイプを変更することはできません。

ただし、例から MyOwnList に独自の暗黙的なキャスト関数を指定すると、セッターに渡すときに自動的に ArrayList に変換されます。

Class MyOwnList
    ' your class code here....
    ' 
    Public Shared Widening Operator CType(ByVal p1 As MyOwnList) As ArrayList
        Dim columns As New ArrayList   
       For Each o As MyObj in p1
          columns.Add(o.Column)   
       Next 
     return columns  
    End Operator 
End Class

次に、プログラムの他の場所でこのコードが機能します。

Dim myList as new MyOwnList
SomeClass.Columns = myList
于 2012-05-12T05:33:43.440 に答える