通过接口或抽象类提供TypeConverter

时间:2014-10-02 09:51:34

标签: .net vb.net plugins typeconverter

我正在将项目的功能转换为具有传出接口的插件,以及由主机实现的传入抽象类。每个插件都将其配置存储在自己的类中,该类将传输到主机并由主机保存。这些配置类由用户在PropertyGrid内编辑,然后在执行之前存储或传输回插件。

配置非常标准,并且共享许多相同的属性,因此我尝试直接从宿主程序提供适当的TypeConverters,这样每个插件都不必实现自己的。插件和配置类看起来像这样:

Public Class MyPlugin
    Implements IPlugin

    Private _myData As PluginData
    Private _host As HostMethods

    ''..stuff..

    <Serializable()> _
    Public Class PluginData
        Friend _someData As String

        <TypeConverter(GetType(HostMethods.MyTypeConverter)), _
            DisplayName("My string data"), _
            DefaultValue("String one")> _
        Public Property SomeData() As String
            Get : Return _someData : End Get
            Set(ByVal value As String) : _someData = value : End Set
        End Property
    End Class
End Class

&#34; HostMethods&#34;是一个抽象类,主机重写为插件提供功能,并且非常标准:

Public MustInherit Class HostMethods
    '..stuff..

    Public MustInherit Class MyTypeConverter : End Class
End Class

然后,当然,主机继承此类,创建一个实例,并传递对每个插件的引用以提供其方法:

Friend Class HostServices
    Inherits HostMethods
    '..stuff..

    Public Shadows Class MyTypeConverter
        Inherits ComponentModel.StringConverter

        Public Overloads Overrides Function Get StandardValuesSupported(...etc...
    End Class
End Class

当设置<TypeConverter(GetType(HostMethods.MyTypeConverter))>时,PropertyGrid只看到摘要中定义的空类,并且我无法在没有循环引用的情况下将代码移动到插件或抽象,所以是什么将MyTypeConverter暴露给插件的正确方法是什么? 我在初始化时将实例化HostServices的引用传递给插件(&#34; {{1} }&#34;),但不知道我是否可以在运行时轻松设置_host属性,并且更愿意在设计时设置属性。


更新:我尝试在运行时添加属性(例如:this question),但这最终对我不起作用,因为我&# 39; ll无法知道哪个属性可以分配哪个TypeConverters。必须使用属性进行分配,以便插件设计人员可以为其属性选择适当的转换。

此外,我研究了像this one这样的解决方案,它涉及手动解析程序集名称,但似乎这需要我的类型转换器与插件在同一个程序集中。

1 个答案:

答案 0 :(得分:0)

到目前为止,我一直无法直接解决这个问题,但对于任何可能因类似问题偶然发现此问题的人,我的解决方法如下:

我在&#34; HostMethods&#34;内创建了一个功能。返回与TypeConverter相同的数据。

Public Overrides Function GetTypeConverterData() As String()
    Return myTypeConverterData 'as appropriate...
End Function

每个插件然后实现它自己的TypeConverter(我试图完全避免的事情),必要时从主机检索数据,根据需要修改它,然后以标准方式返回它。

Public Class MyPlugin
    ''..other plugin stuff..

    <Serializable()> _
    Public Class PluginData
        Friend _someData As String

        <TypeConverter(GetType(MyPlugin.MyTypeConverter)), _
            DisplayName("My string data"), _
            DefaultValue("String one")> _
        Public Property SomeData() As String
            Get : Return _someData : End Get
            Set(ByVal value As String) : _someData = value : End Set
        End Property
    End Class

    Public Class myTypeConverter
        Inherits ComponentModel.StringConverter

        Public Overloads Overrides Function GetStandardValuesSupported(..etc..
            Return True
        End Function

        Public Overloads Overrides Function GetStandardValues(..etc..
            Return MyPlugin._host.GetTypeConverterData()
            'and/or other code, as necessary...
        End Function
    End Class
End Class

这不是理想的,但至少它很简单。