Как передать динамическое число элементов в метод, который принимает ParamArray - PullRequest
0 голосов
/ 30 января 2011

У меня есть метод, который мне нужно вызвать, который принимает ParamArray

Method(ByVal ParamArray elements() As Object)

Мне нужно передать ему две известные строки и неизвестное количество строк на основе переменного числа XmlNodes в XmlDocument

т.е.

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>"

Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 26 июня 2015

Ответ Шевека прекрасно работает. Все, что вам нужно сделать, - это передать созданный / заполненный список методу, ожидающему parmarray как «strElements.ToArray». Я просто использовал это для заполнения DataGridView динамическим числом столбцов, например так (в цикле, создавая новый список strElements для каждой строки данных): dgvData.Rows.Add (strElements.ToArray)

0 голосов
/ 26 июня 2015

Проблема здесь заключается в неинтуитивном скачке между тем, что вы пишете, и тем, что делает компилятор, главным образом из-за того, что синтаксис немного шаткий.

В любом случае, обратите внимание, что подпись вашего метода содержит параметр SINGLE: elements(). () означает свой массив.

Ключевое слово ParamArray позволяет вам "взорвать" элементы массива и передать каждому элементу массива в качестве своего собственного параметра методу - то, что вы уже знали. Но это также означает, что компилятор (или JIT, или любой другой) объединяет эти параметры обратно в один массив.

Вы бы заметили это, если бы у вас не было неудачи определения elements как Object:

т. Е. TL; DR :
Либо передайте каждый элемент массива индивидуально - не вариант в вашем случае, Или передайте один массив для параметра с типом массива.

Dim stuffToPassInToTheMethod As List (Of String) = Новый список (Of String) из {"Magic String One", "Magic String Two"}

'Некоторые циклы и узлы xml .. бла-бла .. в конце концов вызывают метод stuffToPassInToTheMethod.Add (node.Attributes ("yadda"). Значение

Тогда, наконец, просто передайте его методу: crazyMethodNameWithThePOINTLESSParamArray(stuffToPassInToTheMethod.ToArray)

0 голосов
/ 30 января 2011

Мой ответ на данный момент - проверить типы в методе и добавить значения в новый 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, который был бы намного лучше

...