Прежде всего, убедитесь, что у вас есть using System.Linq;
в верхней части файла.
Если у вас есть коллекция, которая реализует IEnumerable
но не IEnumerable<T>
, но вы знаете, объекты все данного типа (например, Control
), то вы можете использовать Cast<T>
LINQ метод расширения:
foreach (var control in Controls.Cast<Control>()
.Where(i => i.GetType() == typeof(TextBox))) {...}
Однако, учитывая ваше положение Where
, это может быть более разумным, в этом случае использовать OfType<T>
метод, который возвращает только те из заданного типа (Cast<T>
генерирует исключение, если что-то не так):
foreach (var control in Controls.OfType<TextBox>()) {...}
Небольшая разница между этой и вашей версией заключается в том, что вышеперечисленное вернет подклассы TextBox
, где, поскольку ваша версия GetType() == typeof(TextBox)
не будет.
В принципе, большинство из методов расширения LINQ определены только для IEnumerable<T>
/IQueryable<T>
, не IEnumerable
/IQueryable
.
Спасибо. Я действительно рассматривал использование «где» в примере, чтобы отличать от OfType, чтобы получить только точные типы, а не все присваиваемые типы. Литье хорошо работает. –
ProfK