Я работаю над видом mapper, который использует System.Reflection
, и в одном случае у меня есть возможности иметь список объектов или обычный объект в моем значении и сделать с ним некоторую логику.
Похоже, это меньше:
if (myValue is IList) {
foreach (var value in myValue) {
...
DoSth(value);
...
}
} else {
...
DoSth(myValue);
...
}
и у меня нет концепции рефакторинга, и в этом случае не DoSth()
код (DoSth()
). Есть ли способ сделать это лучше?
Если вероятное дерево относительно короткое, вы можете сделать что-то вроде:
void Process(object myValue) {
if(myValue is IList) {
foreach(object child in (IList)myValue) {
Process(child);
}
return;
}
...
DoSth(myValue);
...
}
Если дерево глубокое, вы можете использовать объект стека или очереди (в зависимости от глубины - сначала vs bredth-first), чтобы исключить исключения переполнения из стеков-погружений.
Отметим также, что рекурсия является проблемой здесь; например, рассмотрим:
List<object> evil = new List<object>();
evil.Add(evil); // tempting to add a .Beget() extension method here
Process(evil);
DoSth()
«дублированным кодом». Я вижу твой код в порядке.