【问题标题】:asp.net - passing generic listsasp.net - 传递通用列表
【发布时间】:2010-10-24 06:18:46
【问题描述】:

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

代码如下:

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

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

目前,作为对象传递会导致后期绑定分辨率警告,尽管它运行良好。

我尝试了不同的方法来传递 collection 和 elt(Foo 和 Bar 都扩展了一个基类),但似乎无法找出“正确”的方法。

想法?

【问题讨论】:

    标签: asp.net vb.net generics collections


    【解决方案1】:

    我想你正在寻找这样的东西。

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

    【讨论】:

    • 但是在这种情况下 T 是什么?返回值无关紧要——事实上,它实际上是一个 sub。
    • T 是您传递给方法的变量的类型。所以如果你传递一个整数,T 将是一个整数,如果你传递一个 List(Of What) T 将是这样的列表
    • Generics 正是为您想要做的事情而构建的,即为大量不同类型重用相同的函数。每当您调用 DoStuff(Of Integer) 时,所有“T”参数都将变为 Integer 类型。如果调用 DoStuff(Of MyCrazyClass),那么所有 T 参数都是 MyCrazyClass 类型。在幕后,编译器为代码中的每个 DoStuff(Of xxx) 创建一个函数 - 但您只需编写一次。
    • 但问题是我有 12 种不同的类型。我想避免使用 12 种不同的方法。这个 sub 永远不会在应用程序之外重复使用,所以我不担心支持 ICollection,正如你在下面提到的。
    • 重新阅读我之前的评论。上面的代码解决了你的问题。您编写了一种方法,并将其与所有 12 种类型一起使用。
    【解决方案2】:

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

    您应该采用 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 编程。

    【讨论】:

      【解决方案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的类型。

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-15
        • 2018-06-29
        • 2018-04-12
        • 1970-01-01
        • 2022-11-16
        相关资源
        最近更新 更多