【问题标题】:Providing a TypeConverter through an interface or abstract class通过接口或抽象类提供 TypeConverter
【发布时间】:2014-10-02 09:51:33
【问题描述】:

我正在将项目的功能转换为具有传出接口的插件,以及由主机实现的传入抽象类。每个插件将其配置存储在其自己的类中,该类被传输到主机并由主机保存。这些配置类由用户在 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

"HostMethods" 是一个抽象类,主机重写它以向插件提供功能,并且非常标准:

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

当设置&lt;TypeConverter(GetType(HostMethods.MyTypeConverter))&gt; 时,PropertyGrid 只看到抽象中定义的空类,如果没有循环引用,我无法将代码移动到插件或抽象中,所以 什么是正确的将MyTypeConverter 暴露给插件的方法? 我在初始化时将实例化HostServices 的引用传递给插件(“_host”),但不知道是否可以设置TypeConverter 属性在运行时很容易,并且希望在设计时设置属性。


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

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

【问题讨论】:

    标签: .net vb.net plugins typeconverter


    【解决方案1】:

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

    我在“HostMethods”中创建了一个函数,它返回与 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
    

    这并不理想,但至少它是直截了当的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2011-01-09
      • 2012-08-07
      • 2011-04-13
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多