2009-10-23 30 views
-1

在下面的代碼中,我該如何將變量類型傳遞給嵌套的foreach語句? 是的GetControls遞歸函數返回一個列表控件(哇!)動態分類的foreach變量

getControls(String type, Control donde) 

var tipos = new List<Type>() { typeof(Button), typeof(KryptonTextBox) }; 

foreach (Type t in tipos) 
{ 
    List<Control> controls = getControls(t.ToString(), this); 
    foreach (***** c in controls) 
    { 
    c.StateCommon.Back.Color1 = Color.White; 
    }  
} 
+0

恩......「Button」沒有「StateCommon」成員。您將無法在返回的按鈕上運行該代碼。 – 2009-10-23 20:54:03

+0

@Joel你不知道Button的實際類型是什麼,所以很難說明確的。 – technophile 2009-10-23 20:56:07

+0

我稍後再嘗試... – Luiscencio 2009-10-23 20:58:56

回答

4

的迭代變量必須是兼容類型的列表項類型。

因此編譯器只允許你寫

foreach(Control c in controls) 

但在foreach塊內,你可以使用類型轉換調用特定類型的方法:

{ 
    if (c is MyControlType) 
     (c as MyControlType).StateCommon.Back.Color1 = Color.White; 
} 
+2

-1:其他的,你在句法上允許在塊內部放置一個'is'''as',這是完全錯誤的。首先,foreach變量的兼容性可以包括向上,向下或接口強制轉換。其次,當你使用'is''''as'時,你應該使用'as',然後用空檢查代替。 – 2009-10-24 14:37:05

1

如果你只是參考值可用於foreach內的超類型(Control),然後將其聲明爲Control。

如果您有類型特定的邏輯,您仍然需要將其聲明爲Control,但是然後在每次迭代中確定要處理的是哪種類型,並使用強制轉換和條件邏輯。

一種方法是將foreach的主體重構爲一組方法(即Update(Button),Update(KryptonTextBox)),然後調用Update(c)。

7

foreach語句可以投枚舉變量:

IEnumerable objects = ...; 
foreach (AnyTypeHere i in objects) 
    ... 

IEnumerable<Button> buttons = ...; 
foreach (MySpecialButton button in buttons) 
    ... 

這將工作只要所有枚舉中的按鈕是MySpecialButton型比Button導出的。如果你不知道,那麼你可以枚舉只有MySpecialButton型的按鈕是這樣的:

IEnumerable<Button> buttons = ...; 
foreach (MySpecialButton button in buttons.OfType<MySpecialButton>()) 
    ... 

OfType不同於Cast,它過濾枚舉,而不是當一個對象是其拋出異常不能轉換爲目標類型的類型。

+1

這是一個很好的做法。 OfType ()擴展方法適用於不同類型的列表。 – 2009-10-26 20:51:11

1

foreach變量需要匹配列表類型。

foreach(Control c in controls) 

foreach(Object c in controls) 

我猜測,因爲你傳遞的類型的GetControls列表,它只返回該類型的控制,但如果沒有,你將需要驗證的類型

if(t.IsAssignableFrom(c)) 

然後您需要使用反射來設置屬性。