下面这行很可能是罪魁祸首:
enumerateValues(iEnumerator.Current.Value, childNode);
因为enumerateValues 方法接受IEnumerator<KeyValuePair<string, object>>,所以键值对的值将始终为object 类型。因此您不能使用iEnumerator.Current.Value 调用该方法,因为该值不是IEnumerator<KeyValuePair<string, object>> 类型。
这正是错误消息告诉您的内容:
参数 '1':无法从 'object' 转换为 'System.Collections.Generic.IEnumerator>'
您必须先将iEnumerator.Current.Value 转换为正确的类型,然后才能调用该方法。您可以使用as operator 来执行此操作。
private void enumerateValues(IEnumerator<KeyValuePair<string, object>> iEnumerator, TreeNode parentnode)
{
// Loop through the values.
while (iEnumerator.MoveNext())
{
// Try a 'safe' cast of the current value.
// If the cast fails, childEnumerator will be null.
var childEnumerator = iEnumerator.Current.Value as IEnumerator<KeyValuePair<string, object>>;
if (childEnumerator != null)
{
TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Key);
enumerateValues(childEnumerator, childNode);
}
else
{
TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Value.ToString());
}
}
}
如果可以的话,我还建议您使用IEnumerable<T> 而不是IEnumerator<T>。它更清楚地显示了代码的意图,您不必手动处理迭代,您可以在上面使用LINQ。
private void enumerateValues(IEnumerable<KeyValuePair<string, object>> items, TreeNode parentnode)
{
foreach (var item in items)
{
// Try a 'safe' cast of the current value.
// If the cast fails, childEnumerator will be null.
var childEnumerator = item.Value as IEnumerable<KeyValuePair<string, object>>;
if (childEnumerator != null)
{
TreeNode childNode = parentnode.Nodes.Add(item.Key);
enumerateValues(childEnumerator, childNode);
}
else
{
TreeNode childNode = parentnode.Nodes.Add(item.Value.ToString());
}
}
}