【发布时间】: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