从扩展控件返回扩展类型实例的方法

时间:2017-07-10 18:26:23

标签: vb.net winforms

在我的解决方案中,我有一个实现IExtenderProvider的自定义组件,以便为其他控件提供属性。我想为该组件实现一个方法,它以控件作为参数,返回与之关联的扩展组件的实例,如下所示:

    Public Function GetErrorProvider(c As Control) As MyErrorProvider
        Dim errorProvider as MyErrorProvider
        'Some code here
        Return errorProvider 
    End Function

我只想查看表单并循环访问MyErrorProvider类型的控件并使用它,因为我不会在每个表单中包含多个此组件,但我想要更多直接的方法。我想要一些逻辑,这取决于该实例的运行时定义值,超出了表单的范围。

任何想法/建议? 感谢

1 个答案:

答案 0 :(得分:1)

为了完整性,我正在添加从上面链接的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 Function