Объединить словари в рекурсивную функцию? - PullRequest
1 голос
/ 22 апреля 2011

У меня есть функция, которая должна рекурсивно циклически проходить по элементу управления и его дочерним элементам и возвращать любые значения формы в этом элементе управления (текстовые поля, флажки, радиокнопки) и выводить их в виде словаря, где ключ является идентификатором элемента управления.а значением является текст или значение элемента управления.

Однако я сталкиваюсь с проблемой в строке, где происходит рекурсия, она выдает мне следующую ошибку:

Unable to cast object of type '<UnionIterator>d__88 1 [System.Collections.Generic.KeyValuePair 2[System.String,System.String]]' to type 'System.Collections.Generic.Dictionary 2 [System.String, System.String] '. `

Код:

Public Shared Function getFormValuesInsideControl(ByVal control As Control) As Dictionary(Of String, String)
    Dim formValues As New Dictionary(Of String, String)

    If control IsNot Nothing Then
        If control.HasControls = True Then
            For Each childControl As Control In control.Controls
                formValues = formValues.Union(getFormValuesInsideControl(childControl)) 'error happens here'
            Next
        Else
            Select Case TypeName(control)
                Case "TextBox"
                    Dim textbox As TextBox = control
                    formValues.Add(formatControlName(textbox.ID), textbox.Text)
                Case "CheckBox"
                    Dim checkbox As CheckBox = control
                    If checkbox.Checked = True Then
                        formValues.Add(formatControlName(checkbox.ID), "Yes")
                    End If
                Case "RadioButton"
                    Dim radioButton As RadioButton = control
                    If radioButton.Checked = True Then
                        formValues.Add(formatControlName(radioButton.ID), "Yes")
                    End If
            End Select
        End If

    End If

    Return formValues
End Function

Я вижу, чтопроисходит, но я не уверен, почему или как это исправить.

Как я могу объединить эти словари в этой строке?Я видел примеры этого в LINQ, но не думаю, что смогу сделать это здесь из-за рекурсивного аспекта.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2011

Это потому, что Union возвращает IEnumerable<KeyValuePair<x,y>>, а не фактическое Dictionary<x,y>

чтобы исправить это, вы можете сделать это:

     formValues.Union(getFormValuesInsideControl(childControl)).ToDictionary(function (x) x.Key, function (x) x.Value)
2 голосов
/ 22 апреля 2011

Попробуйте что-то вроде этого:

formValues = formValues.Union(getFormValuesInsideControl(childControl)).ToDictionary(Function(o) o.Key, Function(o) o.Value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...