.Net使用反射来定义OfType

时间:2009-05-27 21:55:17

标签: .net vb.net reflection types oftype

我正在使用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 个答案:

答案 0 :(得分: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)ControlCollectionIEnumerable)转换为IEnumerable<Control>,然后获取所有lambda扩展名。

答案 1 :(得分: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())

答案 2 :(得分:0)

为什么不将OfType替换为测试类型的位置?

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

编辑:darin更快......实际上他的解决方案更好,因为它处理派生类

答案 3 :(得分:0)

你尝试过这样的事吗?

Dim query = From i In MyBaseControl.Controls Where i.GetType is ControlType