ASP.NET - 传递泛型列表

3

我有一个实用类,它以泛型列表作为参数。

代码看起来像这样:

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() )

这里大约有十几种不同的类型。

目前,将其传递为对象会导致“后期绑定解析警告”,尽管它可以正常运行。

我尝试了不同的方法来传递集合和elt(Foo和Bar都扩展了一个基类),但似乎无法找到“适当”的方法。

有什么想法吗?

3个回答

7
我想你正在寻找类似这样的东西。
Public Sub DoStuff(Of T)(collection As List(Of T), elt As T)
    ...
    collection.Add(elt)
    ...
End Function

但在这种情况下,T是什么?返回值并不重要 - 实际上,它实际上是一个子程序。 - chris
T是您传递给方法的变量的类型。因此,如果您传递整数,T将是一个整数;如果您传递List(Of Whatever),T将是这样的列表。 - Kasper Holdum
泛型是专门为你正在尝试做的事情而构建的,即重用相同的函数来处理大量不同类型的数据。每当你调用DoStuff(Of Integer)时,所有的“T”参数都变成了整数类型。如果你调用DoStuff(Of MyCrazyClass),那么所有的T参数都是MyCrazyClass类型。在幕后,编译器会为你代码中的每个DoStuff(Of xxx)创建一个函数 - 但你只需要编写一次。 - womp
但问题是我有12种不同的类型。我想避免有12种不同的方法。这个子程序从未在应用程序之外被重复使用,所以我不担心像你下面提到的支持ICollection。 - chris
1
请重新阅读我的上一条评论。上面的代码解决了你的问题。你只需编写一个方法,然后在所有12种类型中使用它即可。 - womp
你能用 SortedList(Of String, anyStructure) 做同样的事情吗? - NewBie1234

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 继承的类型。


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或自定义类等),这正是面向对象编程的强大之处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接