我有一个函数应该递归循环一个控件,它是子节点并返回该控件中的任何表单值(文本框,复选框,单选按钮)并吐出一个字典,其中键是控件ID值是控件的文本或值。
但是我遇到了递归发生的问题,它给了我以下错误:
Unable to cast object of type '<UnionIterator>d__88
1 [System.Collections.Generic.KeyValuePair2[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中看到了这样做的例子,但由于递归方面的缘故,我认为我不能这样做。
答案 0 :(得分:3)
这是因为Union
正在返回IEnumerable<KeyValuePair<x,y>>
而不是实际的Dictionary<x,y>
修复它你可以这样做:
formValues.Union(getFormValuesInsideControl(childControl)).ToDictionary(function (x) x.Key, function (x) x.Value)
答案 1 :(得分:2)
尝试这样的事情:
formValues = formValues.Union(getFormValuesInsideControl(childControl)).ToDictionary(Function(o) o.Key, Function(o) o.Value)