.Net использовать отражение для определения OfType - PullRequest
2 голосов
/ 28 мая 2009

Я использую System.Reflection для загрузки типа, который я не могу загрузить во время разработки. Мне нужно вытащить все элементы управления в коллекции этого типа, однако, команда OfType, похоже, не нравится синтаксис отражения. вот "близко" к тому, что я получил.

Dim ControlType As Type = System.Reflection.Assembly.GetAssembly( _
                          GetType(MyAssembly.MyControl)) _
                         .GetType("MyAssembly.MyUnexposedControl")

Dim Matches as List(Of Control) = MyBaseControl.Controls.OfType(Of ControlType)

Так что этот код фальшивый, он не работает, но вы понимаете, что я пытаюсь сделать. Так есть ли способ использовать отражение и получить все элементы управления этого типа?

Ответы [ 4 ]

3 голосов
/ 28 мая 2009

OfType является универсальным методом, поэтому вы можете задать ему статический тип (например, OfType(Of String)), а не System.Type, определенный во время выполнения.

Вы можете сделать что-то вроде:

Dim CustomControlType as Type = LoadCustomType()

MyBaseControl.Controls.Cast(Of Control)().Where(Function(ctrl) ctrl.GetType().IsAssignableFrom(CustomControlType))

Использование Cast(Of Control) для преобразования ControlCollection (IEnumerable) в IEnumerable<Control>, который затем получает все лямбда-расширения.

0 голосов
/ 28 мая 2009

Вы пробовали что-то подобное?

Dim query = From i In MyBaseControl.Controls Where i.GetType is ControlType
0 голосов
/ 28 мая 2009

почему бы не заменить OfType на Where, в котором вы тестируете тип?

Dim Matches as List(Of Control) = MyBaseControl.Controls.Where(Function(ctl) ctl.GetType() = ControlType)

РЕДАКТИРОВАТЬ: Дарин был быстрее ... и на самом деле его решение лучше, потому что он обрабатывает производные классы

0 голосов
/ 28 мая 2009

Попробуй так:

Dim ControlType As Type = System.Reflection.Assembly.GetAssembly( _
                      GetType(MyAssembly.MyControl)) _
                     .GetType("MyAssembly.MyUnexposedControl")

Dim Matches as List(Of Control) = MyBaseControl.Controls.Where(Function(control) ControlType.GetType().IsAssignableFrom(control.GetType())
...