2014-10-09 63 views
1

我正在研究使用System.Reflection的一種映射器,在一種情況下,我有可能在我的值中包含對象或普通對象的列表,並使用它創建一些邏輯。如何重構列表<object>/object的操作?

它看起來像這樣更少:

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

,我也沒有概念重構它,以及(在這種情況下DoSth())不重複的代碼。有什麼方法可以做得更好嗎?

+2

我不會調用兩個調用'DoSth()''重複代碼「。我看到你的代碼正常。 – SJuan76 2014-10-09 09:49:14

+5

我沒有看到問題。多次調用方法不是你所稱的*重複代碼*。如果你這樣定義它,你就不應該兩次調用任何方法,這會破壞整個方法的重點。 *重複代碼*是用多種方法重複的一段代碼。 – 2014-10-09 09:50:22

+0

如果'myValue'是一個列表,但它的一個*元素*也是一個列表,你想要做什麼? – 2014-10-09 09:53:20

回答

2

如果可能的樹是比較短的,你可以這樣做:

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

若樹深,你可以使用堆棧或隊列對象(取決於深度優先VS bredth一)以防止堆棧潛水溢出異常。

還要注意遞歸這裏是個問題;例如,考慮:

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

這可能是個好主意,謝謝。 – 2014-10-09 10:09:10