2009-08-24 47 views
1

我有一堆類都有一個屬性稱爲序列。該屬性是通過一個名爲ISequenced的接口實現的。對於這個例子,我們可以調用其中一個類A.
當我有一個列表(A)時,我希望能夠使用標準List.Sort(addressof委託)對它們進行排序,其中委託是一個標準函數在兩個ISequenced對象中,比較它們的序列號並返回一個布爾標誌,而不是爲實現ISequenced的每個類聲明一個函數。使用反射爲一般類型的代表和接口

E.g.

Dim li as List(of A) = GetValues() 

li.Sort(addressof SortBySeq) 

... 

Public Function SortBySeq(ByVal ob1 as ISequenced, ByVal ob2 as ISequenced) as Boolean 
    return ob1.Sequence.CompareTo(ob2.Sequence) 
End If 

編輯:使用上面給了我以下錯誤:

"Overload resolution failed because no accessible 'Sort' can be called with these arguments: 'Public Sub Sort(comparison As System.Comparison(Of A))': Option Strict On does not allow narrowing in implicit type conversions between method 'Public Function SortBySeq(ob1 As ISequenced, ob2 As ISequenced) As Integer' and delegate 'Delegate Function Comparison(Of A)(x As A, y As A) As Integer'. 'Public Sub Sort(comparer As System.Collections.Generic.IComparer(Of A))': 'AddressOf' expression cannot be converted to 'System.Collections.Generic.IComparer(Of A)' because 'System.Collections.Generic.IComparer(Of A)' is not a delegate type."

我怎麼才能做到這一點(如果它在VB.NET甚至可以聲明函數

謝謝, 戴恩。

回答

0

最後不需要實現IComparer,因爲我只是比較小數。結果發現,.NET 3.5至少爲委託人增加了一些協變能力,所以我已經升級到了上面的例子,上面給出的例子似乎工作得很好。

1

實現一個IComparer的,一切你需要的是here

編輯: 哦,我明白了什麼是磨擦。所有具有Sequence屬性的類都必須實現一個可比較的接口。例如。使用IHaveSequence並做一個IComparer <IHaveSequence>。 IHaveSequence的定義應該很明顯。

+0

IComparer將允許我比較同一類的兩個對象,但我不想爲每個使用接口ISequenced的類實現一個函數。我用一個代碼示例擴展了我的問題,這可能會讓您更好地瞭解我正在嘗試做什麼。 – link664 2009-08-24 06:18:41

+0

這就是界面的美感。見上面的編輯。 – xanadont 2009-08-24 12:42:01

+0

我想它應該是IHasSequence。 – xanadont 2009-08-24 14:14:19