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