asp.net - 传递通用列表

时间:2009-05-06 17:14:15

标签: asp.net vb.net generics collections

我有一个实用程序类,它将通用列表作为参数。

代码如下:

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都扩展了一个基类)但似乎无法找出“正确”的方法。

想法?

3 个答案:

答案 0 :(得分:7)

我认为你正在寻找类似的东西。

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

答案 1 :(得分: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

的类型

答案 2 :(得分:1)

您应该始终努力构建/使用强类型代码。想象一下,如果整数作为集合对象传递会发生什么 - 您必须手动检查变量的类型。更糟糕的是,您的方法的用户必须在文档中查找您的方法所需的对象,因为它是第一个参数。

你应该采用 womp 建议的方法,或者更好的是你应该让你的参数需要一个扩展泛型集合接口的对象,ICollection(Of 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编程。