如何重构列表<object> / object?</object>的操作

时间:2014-10-09 09:43:29

标签: c# refactoring

我正在处理使用System.Reflection的映射器,在一种情况下,我有可能在我的值中包含对象列表或普通对象,并用它做一些逻辑。

看起来更像是这样:

if (myValue is IList) {
    foreach (var value in myValue) {
        ...
        DoSth(value);
        ...
    }
} else {
    ...
    DoSth(myValue);
    ...
}

我没有重构它的概念,也没有重复代码(在这种情况下为DoSth())。有没有办法更好地做到这一点?

1 个答案:

答案 0 :(得分:2)

如果可能的树相对较短,您可以执行以下操作:

void Process(object myValue) {
    if(myValue is IList) {
        foreach(object child in (IList)myValue) {
            Process(child);
        }
        return;
    }
    ...
    DoSth(myValue);
    ...
}

如果树很深,你可以使用堆栈或队列对象(取决于深度优先与bredth优先),以防止堆栈潜水溢出异常。

另请注意递归是一个问题;例如,考虑:

List<object> evil = new List<object>();
evil.Add(evil); // tempting to add a .Beget() extension method here
Process(evil);