2012-05-12 91 views
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 

這將讓我通過賦予它各種集合類型的......除了方便地設置屬性,我不能這樣做,因爲顯然方法採取財產本身的類型的參數......我得到的投訴:

「設置」參數必須具有相同的類型包含屬性

是有做的方法是什麼?

+1

可能重複[有沒有辦法重載.NET中的屬性](http://stackoverflow.com/questions/2238048/is-there-a-way-to-overload-a-property-in-淨) –

+1

我不會這樣做...只是寫它作爲一種方法。 –

回答

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 

我認爲這是儘可能接近真正的過載性能...

編輯

我相信正確的方法來做你想做的是在MyOwnList類上定義一個ToArrayList()方法。

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 

如果您沒有訪問類的源代碼,您仍然可以通過擴展方法實現這一目標。

+0

對於第二種方法的適當性,你是非常正確的。我實際上並不擁有MyOwnList,因此我無法修改它,即使它被聲明爲「部分」,我也無法擴展它,因爲它進入了單獨的程序集...所以我在那裏運氣不佳...但第一種方法將起作用。謝謝! – ekkis

+2

如果您使用VS2008或更高版本,那麼您可以將該方法聲明爲模塊中的擴展方法。沒有必要讓班級成爲部分,也不需要在同一個大會上。優秀的文章,幫助我開始使用擴展:http://msdn.microsoft.com/en-us/magazine/cc163317.aspx –

+0

StevenDotNet:真棒!我實際上忘了我已經寫了擴展方法,所以謝謝,這將在許多其他方面提供很大的幫助,因爲我正在使用我無法觸及的現有框架 – ekkis

3

不,您不能在自動屬性中更改Setter所需的參數類型。

但是,您可以從您的示例中爲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 
+1

我喜歡那樣!可悲的是我不能使用它,因爲我無法修改MyOwnList(這不是我的),但你有一個很好的建議點。謝謝。 – ekkis