Скорее всего, виновником является следующая строка:
enumerateValues(iEnumerator.Current.Value, childNode);
Поскольку метод enumerateValues
принимает IEnumerator<KeyValuePair<string, object>>
, значения пар ключ-значение всегда будут иметь тип object
. Поэтому вы не можете вызвать метод с iEnumerator.Current.Value
, потому что значение не относится к типу IEnumerator<KeyValuePair<string, object>>
.
Это именно то, что говорит вам сообщение об ошибке:
Аргумент '1': невозможно преобразовать из 'объекта' в 'System.Collections.Generic.IEnumerator >'
Прежде чем вы сможете вызвать метод, вам нужно сначала привести iEnumerator.Current.Value
к правильному типу. Вы можете сделать это, используя как оператор .
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());
}
}
}