2010-04-16 97 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没有的时候我需要的相匹配的情况。 (不幸的是,我现在不记得现在的情况了。)

相关问题