Я могу использовать foreach для возврата только определенного типа из набора?

Если я ввожу код ниже, я получаю ошибку. В основном foreach повредится, когда он столкнется с Управлением, которое не является маркировкой.

foreach (Label currControl in this.Controls()) {

...
}

Я должен сделать что-то вроде этого.

foreach (Control currControl in this.Controls()) {
    if(typeof(Label).Equals(currControl.GetType())){

    ...
    }

}

кто-либо может думать о лучшем способе сделать его без меня бывший должный проверить тип? Я могу так или иначе заставить foreach пропускать объекты, которые не являются Маркировками?

5
задан Diskdrive 4 May 2010 в 07:18
поделиться

2 ответа

Если вы используете .NET 3.5 или новее, вы можете сделать что-то вроде этого

foreach(var label in this.Controls().OfType<Label>()) {
}

OfType будет игнорировать типы, которые не могут быть преобразованы в T. См. http: // msdn. microsoft.com/en-us/library/bb360913.aspx

10
ответ дан 18 December 2019 в 10:42
поделиться

Брайан дал наиболее подходящий ответ с точки зрения OfType . Однако я хотел указать, что есть лучший способ проверки типов в тех случаях, когда вам нужно это сделать. Вместо вашего текущего кода:

if(typeof(Label).Equals(currControl.GetType())){

...
}

Вы можете использовать:

if (currControl is Label)
{
    Label label = (Label) currControl;
    // ...
}

или:

Label label = currControl as Label;
if (label != null)
{
    // ...
}

Обратите внимание, что обе эти альтернативы будут также включать подклассы Label , который ваш исходный код нет.

6
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: