我正在处理使用System.Reflection
的映射器,在一种情况下,我有可能在我的值中包含对象列表或普通对象,并用它做一些逻辑。
看起来更像是这样:
if (myValue is IList) {
foreach (var value in myValue) {
...
DoSth(value);
...
}
} else {
...
DoSth(myValue);
...
}
我没有重构它的概念,也没有重复代码(在这种情况下为DoSth()
)。有没有办法更好地做到这一点?
答案 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);