通用扩展方法,List(Of T)

时间:2013-07-08 17:34:20

标签: vb.net generics extension-methods

我只是想吐出一个字符串,它将List的值聚合成NewLine分隔的字符串。

<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

这个方法在调试时有助于查看List的全部内容,而?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)的扩展。另外,我想实现的目标是什么?

1 个答案:

答案 0 :(得分:2)

您是否尝试在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