【问题标题】:Generic extension method, List(Of T)通用扩展方法,List(Of T)
【发布时间】:2013-07-08 17:34:19
【问题描述】:

我只是想吐出一个字符串,它将列表的值聚合到一个新行分隔的字符串中。

<Extension()>
Public Function ToColumn(Of T)(ByVal source As IEnumerable(Of T)) As String
    ' assuming Aggregate(Of String) will be inefficient, using StringBuilder
    Dim sb As New StringBuilder()
    For Each val As T In source
        sb.Append(val.ToString() & Environment.NewLine)
    Next
    Return sb.ToString()
End Function

此方法有助于调试查看列表的全部内容,而?source 仅在即时窗口中吐出前 100 个元素(也许有不同的方法可以做到这一点?)。我只是希望能够快速将其复制到 Excel 之类的文件中进行分析。

问题是,虽然这个方法可以编译,但在使用中,它并没有被识别为 List(of T) 的扩展,即

Dim result As Int32()
Debug.Print(result.ToList().ToColumn())
' this line doesn't compile:
' 'toColumn' is not a member of 'System.Collections.Generic.List(Of Integer)'

我想在任何我可以装箱到 Object 中并获得 .ToString() 的东西上重用这个方法(一切!),因此它的通用方面。我见过很多人在通用 T 中添加约束,即Where T : Constraint,但我的约束将是 Object,因为此方法的性质也是如此,它不会编译。

我的问题是为什么它不被识别为 List(Of Integer) 的扩展。另外,我想要实现的目标可行吗?

【问题讨论】:

  • 您的扩展方法是否在这些地方范围内的模块中?
  • 你是如何添加方法的? Excel 中的本机 VBA 实现基于 VB6。您需要将其作为 VSTO 组件才能使用 .Net。
  • 查看Extension Methods (Visual Basic) 并确保您遵守所有规则(在模块中声明等)。你的代码,可见的,是正确的。
  • @JimWooley - 你的评论没有意义。
  • 要测试您的扩展方法是否在范围内,请尝试调用ModuleName.ToColumn(result.ToList())。您应该能够显式引用该方法(请注意,它可能在您的智能感知中不可见,但代码应该可以编译)。如果您遇到错误,您可能忘记了Import 语句,或者您的模块可能不是Public,等等。

标签: vb.net generics extension-methods


【解决方案1】:

您是否尝试过在List(Of T) 上使用扩展方法而不是IEnumerable(Of T),如下所示:

<Extension()>
Public Function ToColumn(Of T)(ByVal source As List(Of T)) As String
    ' assuming Aggregate(Of String) will be inefficient, using StringBuilder
    Dim sb As New StringBuilder()
    For Each val As T In source
        sb.Append(val.ToString() & Environment.NewLine)
    Next
    Return sb.ToString()
End Function

【讨论】:

  • List(Of T) implements IEnumerable(Of T) - 使用 List(Of T) 并使用 IEnumerable(Of T) 构建方法时没有区别,使其更广泛有用。
  • 与其将源代码更改为 List(T),不如直接修改实现代码以使用 Debug.Print(result.ToColumn()) 并完全避免 List 转换?除非您通过 IEnumerable 接口 (.add/.Remove) 做您不能做的事情,否则您不应该需要列表
  • @JimWooley 我已将代码更改为更简洁的result.ToColumn()ToList() 是我调试工作的残余,正如@Cyborgx37 指出的那样,由于继承,它没有任何区别。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多