我正在将项目的功能转换为具有传出接口的插件,以及由主机实现的传入抽象类。每个插件都将其配置存储在自己的类中,该类将传输到主机并由主机保存。这些配置类由用户在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这样的解决方案,它涉及手动解析程序集名称,但似乎这需要我的类型转换器与插件在同一个程序集中。
答案 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
这不是理想的,但至少它很简单。