private void enumerateValues(IEnumerator<KeyValuePair<string, object>> iEnumerator, TreeNode parentnode)
{
if(iEnumerator is IEnumerable)
{
// ADD THE KEY
TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Key);
enumerateValues(iEnumerator.Current.Value, childNode);
}
else
{
/// add the value
TreeNode childNode = parentnode.Nodes.Add(iEnumerator.Current.Value.ToString());
}
}
我以某种方式得到以下错误:
最佳重载方法匹配'WindowsFormsApplication1.Form1.enumerateValues(System.Collections.Generic.IEnumerator&lt; System.Collections.Generic.KeyValuePair&lt; string,object&gt;&gt;, System.Windows.Forms.TreeNode)'有一些无效的参数
参数'1':无法从'object'转换为'System.Collections.Generic.IEnumerator&lt; System.Collections.Generic.KeyValuePair&lt; string,object&gt;&gt;'
我该如何解决呢
答案 0 :(得分:1)
以下几行很可能是罪魁祸首:
enumerateValues(iEnumerator.Current.Value, childNode);
由于enumerateValues
方法接受IEnumerator<KeyValuePair<string, object>>
,因此键值对的值始终为object
类型。因此,您无法使用iEnumerator.Current.Value
调用该方法,因为该值不属于IEnumerator<KeyValuePair<string, object>>
类型。
这正是错误消息告诉您的内容:
参数'1':无法从'object'转换为'System.Collections.Generic.IEnumerator&lt; System.Collections.Generic.KeyValuePair&lt; string,object&gt;&gt;'
在调用方法之前,您必须先将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());
}
}
}