Как узнать, является ли объект <type>или потомком <type> - PullRequest
3 голосов
/ 16 апреля 2010

У меня есть следующий код:

foreach (var control in this.Controls)
{

}

Я хочу сделать что-то вроде control.Hide() там. Но предметы из коллекции this.Controls не относятся к типу Control (они Object).

Кажется, я не могу вспомнить безопасный способ приведения этого к вызову hide, если он действительно имеет тип Control и иначе ничего не делает. (Я - трансплантированный программист на Delphi и продолжаю думать, что-то вроде control is Control.)

Ответы [ 6 ]

5 голосов
/ 16 апреля 2010

Вот случай, когда вы не хотите использовать var.

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

делает именно то, что вы хотите.

Проверьте это, если не верите.

Для других сценариев, где вы могли бы иметь смешанную коллекцию, вы могли бы сделать что-то вроде

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

}
1 голос
/ 16 апреля 2010

Все остальные ответы (подтверждающие вашу догадку), вероятно, правильные.

Я столкнулся с ситуацией, когда <a href="http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx" rel="nofollow noreferrer">Type.IsAssignableFrom</a> совпал с тем, что мне нужно, а is - нет. (К сожалению, сейчас я не помню, какая была ситуация.)

1 голос
/ 16 апреля 2010

Или в качестве альтернативы вы также можете сделать

foreach(var control in this.Controls.OfType<Control>())
{
  control.Hide();
}
1 голос
/ 16 апреля 2010
Control c = control as Control;
if (c != null)
    c.Hide();

или

if (control is Control)
    ((Control)control).Hide();
1 голос
/ 16 апреля 2010

Именно так.

foreach (var control in this.Controls)
{
    if(control is Control) 
    {
        ((Control)control).Hide(); 
    }
}
0 голосов
/ 16 апреля 2010

Есть несколько способов сделать это:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...