2014-10-02 29 views
0

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

这些配置非常标准,并且共享许多相同的属性,所以我试图直接从主机程序提供适当的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 

当设置<TypeConverter(GetType(HostMethods.MyTypeConverter))> PropertyGrid只能看到抽象中定义的空类,并且我无法将代码移动到插件或没有循环引用的摘要,所以MyTypeConverter暴露给插件的正确方法是什么?我在初始化时将一个对HostServices实例化的插件的引用传递给插件(“_host”),但不知道我是否可以在运行时轻松设置TypeConverter属性,并且希望将该属性设置为design-时间。


更新:我尝试了在运行时添加属性(例如:this question),但不为我工作进行到底,因为我没有办法知道哪些属性可以分配哪些TypeConverters。为属性指定属性是必要的,这样插件设计人员可以为其属性选择适当的转换。

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

回答

0

到目前为止,我一直无法直接解决这个问题,但任何人谁可能有类似的问题,在此跌倒,我的变通方法如下:

我内“HostMethods”返回创建一个功能与TypeConverter相同的数据。

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

每个插件然后实现它自己的类型转换器(的东西,我想完全避免),根据需要,从主机中检索数据,修改它的必要,然后返回它的标准方式。

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 

这并不理想,但至少它很直接。