2009-05-06 77 views
3

我有一個實用工具類,它將通用列表作爲參數。asp.net - 傳遞通用列表

代碼如下所示:

Function DoStuff(collection as Object, elt as Object) 
    ... 
    collection.Add(elt) 
    ... 
End Function 

這就是所謂的有:

DoStuff(List(Of Foo), new Foo()) 
DoStuff(List(Of Bar), new Bar()) 

大約有十幾種不同的類型。

目前,儘管它運行良好,但作爲Object傳遞結果會導致延遲分辨率警告。

我已經嘗試了不同的方式來傳遞集合和elt(Foo和Bar都擴展基類),但似乎無法弄清楚「正確」的方式來做到這一點。

想法?

回答

7

我認爲你正在尋找這樣的東西。

Public Sub DoStuff(Of T)(collection As List(Of T), elt As T) 
    ... 
    collection.Add(elt) 
    ... 
End Function 
+0

但是在這種情況下T是什麼?返回值並不相關 - 事實上,它實際上是一個子集。 – chris 2009-05-06 17:38:56

1

您應該始終努力構建/使用強類型代碼。想象一下,如果一個整數作爲集合對象傳遞,會發生什麼情況 - 您必須手動檢查變量的類型。更糟的是,你的方法的用戶必須在文檔中查找你的方法需要什麼類型的對象,因爲它是第一個參數。

應該由womp,甚至更好,你應該讓你的參數要求,擴展了通用的集合接口,ICollection的(中T)的對象提出的辦法去:

Public Function DoStuff(Of T)(collection As ICollection(Of T), elt As T) As stuff 
... 
collection.Add(elt) 
... 
End Function 

,因爲這會允許方法的用戶不僅傳遞列表,而且傳遞繼承ICollection(Of T)接口(synchronizedCollection,HashSet,LinkedList或自定義類等)的所有其他類,這是OO編程的力量。

3

womp和Qua的答案是我認爲正確的,但是如果你的12種類型都是從一些普通的基類繼承而來的(正如你原來的問題所暗示的那樣),你可以編寫這樣的方法,使它適用於你的類型,只有你的類型,例如:

Public Sub DoStuff(Of T As YourBaseClass)(collection As List(Of T), elt As T) 
    ... 
    collection.Add(elt) 
    ... 
End Sub 

這樣的方法僅適用於從YourBaseClass繼承的類型。

相關問題