我正在寻找能够识别是否可能的任何人,我正在编写一个小型但可扩展的应用程序,它将具有插件架构。
为确保应用程序适用于当前应用程序,我使用自定义属性附加到程序集
[AttributeUsage(AttributeTargets.Assembly)]
class PluginAttributes: Attribute
{
public PluginAttributes(string name, string description, string version, string author)
{
Name = name;
Description = description;
Version = version;
Author = author;
}
public string Name { get; private set; }
public string Description { get; private set; }
public string Version { get; private set; }
public string Author { get; private set; }
public XXXXXX Implements { get; private set; }
}
我的目标是'Implements'属性将识别适当的插件的Interface类型。我在库中定义了许多接口,例如ICompress,IEncrypt,ILogging等。
该属性将用于对其类型的插件进行分类,而无需为每个插件创建单独的属性。
我知道我可以将它作为字符串传递并使用反射或使用枚举,但我希望代码尽可能低维护,以便可以开发插件而无需触及应用程序的核心。
答案 0 :(得分:0)
我已经制作了各种类型的插件机制,并且通常更容易创建插件类的实例并检查各种接口,而不是在属性上定义它。这将为插件实现多个接口打开大门,这很不错。
你可以使用反射这样做(假设你知道类型名称):
object plugin = Activator.CreateInstance("Assembly.Name", "Type.Class.Name");
if (plugin is ILogging)
{ ... }
if (plugin is IEncrypt)
{ ... }
对于您当前的代码,我建议您输入Implements
属性Type
的类型,并使用typeof(ILogging)
,typeof(IEncrypt)
等填写。