0

我有一个需要调用的方法,它接受一个 ParamArray

Method(ByVal ParamArray elements() As Object)

我需要根据 XmlDocument 中可变数量的 XmlNode 向它传递两个已知字符串和未知数量的字符串

IE

Method("Known String 1", "Known String 2", Node1.OuterXml, ..., NodeN.OuterXml)

我怎样才能做到这一点?

我尝试遍历节点并创建和传递:

List(Of String)这导致elements()包含"Known String 1", "Known String 2", System.Collections.Generic.List[System.String]

List(Of String).ToArray这导致elements()包含"Known String 1", "Known String 2", System.String[]

String()这导致elements()包含"Known String 1", "Known String 2", System.String[]

Collection这导致elements()包含"Known String 1", "Known String 2", Microsoft.VisualBasic.Collection

我想要的,例如 3 个节点是elements()包含"Known String 1", "Known String 2", "<node 1>", "<node 2>", "<node 3>"

这可能吗?

4

3 回答 3

0

这里的问题是您编写的内容与编译器所做的事情之间的非直观飞跃 - 主要是因为语法有点不稳定。

无论如何,请注意您的方法签名包含一个 SINGLE 参数:elements()。这()意味着它是一个数组。

关键字允许您“ParamArray分解”数组的元素并将每个数组元素作为其自己的参数传递给该方法 - 这是您已经知道的。但这也意味着编译器(或 JIT 或其他)将这些参数重新组合回单个数组。

如果您没有不幸定义elementsObject

所以TL;DR
或者单独传递每个数组元素 - 在你的情况下不是一个选项,或者为数组类型的参数传递一个数组。

Dim stuffToPassInToTheMethod As List(Of String) = New List(Of String) From {"Magic String One", "Magic String Two"}

' Some loops and xml nodes.. blah blah.. end up calling stuffToPassInToTheMethod.Add(node.Attributes("yadda").Value

Then finally just pass it to the method: crazyMethodNameWithThePOINTLESSParamArray(stuffToPassInToTheMethod.ToArray)

于 2015-06-26T10:16:36.387 回答
-1

到目前为止,我的答案是检查方法中的类型并将值添加到新的 List(Of String) 中,然后使用列表,而不是对象数组:

    Dim strElements As New List(Of String)        

    For Each element As Object In elements
        If element.GetType Is GetType(System.String) Then
            strElements.Add(element)
        ElseIf element.GetType Is GetType(System.Collections.Generic.List(Of String)) Then
            For Each s As String In element
                strElements.Add(s)
            Next
        End If
    Next

但是,如果有更好的方法可以直接将单个字符串添加到 ParamArray,那就更好了

于 2011-01-30T16:23:25.027 回答
-2

Shevek 的回答效果很好。然后,您所要做的就是将您创建/填充的列表传递给期望 parmarray 作为“strElements.ToArray”的方法。我只是用它来填充具有动态列数的 DataGridView,如下所示(在循环中,为每行数据创建一个新的 strElements 列表): dgvData.Rows.Add(strElements.ToArray)

于 2015-06-26T09:05:25.503 回答