在我的解决方案中,我有一个自定义组件,它实现了IExtenderProvider,以便为其他控件提供属性。我想为该组件实现一个方法,该方法以控件为参数,返回与之关联的扩展程序组件的实例,如下所示:
Public Function GetErrorProvider(c As Control) As MyErrorProvider
Dim errorProvider as MyErrorProvider
'Some code here
Return errorProvider
End Function我想简单地查看表单并循环查找MyErrorProvider类型的控件并使用它,因为每个表单不会有超过一个这样的组件,但我想要一种更直接的方法。我希望在表单范围之外的一些依赖于运行时为该实例定义的值的逻辑中使用此方法。
有什么想法/建议吗?谢谢
发布于 2017-07-11 20:42:41
出于完整性的目的,我添加了从上面链接的C#代码转换并略微调整的解决方案。这似乎只能通过反射来实现(如果我错了,请纠正我!):
Public Shared Function GetErrorProvider(control As Control) As MyErrorProvider
'get the containing form of the control
Dim form = control.GetContainerControl()
'use reflection to get to "components" field
Dim componentField = form.[GetType]().GetField("components", BindingFlags.NonPublic Or BindingFlags.Instance)
If componentField IsNot Nothing Then
'get the component collection from field
Dim components = componentField.GetValue(form)
'locate the ErrorProvider within the collection
Return TryCast(components, IContainer).Components.OfType(Of MyErrorProvider)().FirstOrDefault()
Else
Return Nothing
End If
End Functionhttps://stackoverflow.com/questions/45019254
复制相似问题