【发布时间】: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
当设置<TypeConverter(GetType(HostMethods.MyTypeConverter))> 时,PropertyGrid 只看到抽象中定义的空类,如果没有循环引用,我无法将代码移动到插件或抽象中,所以 什么是正确的将MyTypeConverter 暴露给插件的方法? 我在初始化时将实例化HostServices 的引用传递给插件(“_host”),但不知道是否可以设置TypeConverter 属性在运行时很容易,并且希望在设计时设置属性。
更新:我尝试在运行时添加属性(例如:this question),但最终对我不起作用,因为我没有办法知道将哪些 TypeConverters 分配给哪些属性。必须使用属性进行分配,以便插件设计人员可以为其属性选择适当的转换。
此外,我还研究了 this one 之类的解决方案,其中涉及手动解析程序集名称,但这似乎需要我的类型转换器与插件位于同一程序集中。
【问题讨论】:
标签: .net vb.net plugins typeconverter