我正在使用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)
因此代码是虚假的,它不起作用,但你知道我想要做什么。那么有没有办法使用反射并获得该类型的所有控件?
答案 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)
将ControlCollection
(IEnumerable
)转换为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