2009-05-27 7 views
2

Я использую System.Reflection для загрузки типа, который я не могу загрузить в другое время во время разработки. Мне нужно вытащить все элементы управления в коллекцию этого типа, однако, команда OfType, похоже, не похожа на синтаксис отражения. вот «близко к», что я получил.. Использование сети Reflection To Define 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) 

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

ответ

3

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

это выглядит хорошо, однако, «Где», кажется, не появляются в System.Web.UI.ControlCollection –

+0

@Russ Где метод расширения на IEnumerable, так же как OfType. Пока у вас есть пространство имен System.Linq, вы получите доступ к обоим методам. –

+0

ControlCollection не реализует IEnumerable –

0

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

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()) 
0

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

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

EDIT: Дарин был быстрее ... и на самом деле его решение лучше, потому что он обрабатывает производные классы

0

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

Dim query = From i In MyBaseControl.Controls Where i.GetType is ControlType 
Смежные вопросы