2010-04-16 93 views
3

器的新生代,我有以下代碼:如何找出如果對象是<type>或<type>

foreach (var control in this.Controls) 
{ 

} 

我想要做的事就像control.Hide()在那裏。但this.Controls集合中的項目不是Control(它們是Object)。

我似乎無法記住安全的方法來施放這個來調用hide,如果它確實是Control類型的,那麼除此之外什麼也不做。 (我是一個移植的Delphi程序員,我一直在思考類似control is Control。)

回答

5

在這裏你不想使用VAR的情況下。

foreach (Control control in this.Controls) 
{ 
    control.Hide(); 
} 

確實如你所願。

如果您不相信,請進行測試。

對於其他情況下,您可能有混合的集合,你可以不喜歡

foreach (var foo in listOfObjects.OfType<Foo>()) 
{ 

} 
+0

我沒有這樣做,因爲resharper認爲該集合的唯一其他選項是「Object」。我假定(正如我在我的問題中指出的那樣)由集合返回的值是'Object'類型的,並且可以是不同類型的類。 – Vaccano 2010-04-16 04:14:44

+1

在這種情況下,R#是錯誤的,而且Anthong Pegram是對的。 Controls集合中的所有對象都是Control類型的,因此將迭代變量聲明爲「Control」是安全的。其他解決方案只是過分複雜的事情,這非常簡單。 – EMP 2010-04-16 04:18:07

+1

ControlCollection是C#中的預泛型,因此不是強類型的,這就是爲什麼在var上的類型推斷拉對象而不是控制。但是,您應該可以安全地使用Control控件而不是var控件,因爲該集合實際上只能控制控件。就像如果你有一個只包含ints的ArrayList,你可以說(int i在arrayList中),即使它在技術上將項目存儲爲對象。 – 2010-04-16 04:19:14

0

有幾種方法可以做到這一點:

if (control is Control) 
    ((Control)control).Hide(); 

if (control is Control) 
    (control as Control).Hide(); 

,或者如果你只是想迭代在控件上,

foreach(var control in this.Controls.Cast<Control>()) 
    control.Hide(); 
+0

-1:對於你的三個例子中的每一個,都有一個更好的方法來做到這一點。前兩個應該是一個'as',然後是空檢查。最後應該使用'OfType'而不是'Cast',或者使用'foreach(this.Controls中的Control control)',這取決於預期的行爲。 – 2010-04-16 04:53:18

1

就是這樣。

foreach (var control in this.Controls) 
{ 
    if(control is Control) 
    { 
     ((Control)control).Hide(); 
    } 
} 
+1

-1:對於C#3,它* *因此*更清潔使用'var控制this.Controls.OfType ()' – 2010-04-16 04:49:28

+0

很高興知道,謝謝。 – 2010-04-16 12:12:51

1
Control c = control as Control; 
if (c != null) 
    c.Hide(); 

if (control is Control) 
    ((Control)control).Hide(); 
+0

你有他們在錯誤的順序 - 因爲''比'is'更好。 – 2010-04-16 04:50:37

+0

編輯訂單,以反映「as」優於「is」的事實。 – MatthewKing 2010-04-16 05:36:27

1

或作爲備選,你也可以做

foreach(var control in this.Controls.OfType<Control>()) 
{ 
    control.Hide(); 
} 
+0

(目前尚不清楚OP *是否知道*所有項目都是'Control's - 如果不是,'OfType'會比'Cast'更好) – 2010-04-16 04:15:38

+0

是的好點,修正。 – 2010-04-16 04:43:39

1

所有其他答案(確認您的直覺)可能是正確的。

我遇到過Type.IsAssignableFromis沒有的時候我需要的相匹配的情況。 (不幸的是,我現在不記得現在的情況了。)

相關問題