在C#中将已实现的接口指定为属性

时间:2015-11-02 15:48:49

标签: c# plugins reflection interface attributes

我正在寻找能够识别是否可能的任何人,我正在编写一个小型但可扩展的应用程序,它将具有插件架构。

为确保应用程序适用于当前应用程序,我使用自定义属性附加到程序集

[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等。

该属性将用于对其类型的插件进行分类,而无需为每个插件创建单独的属性。

我知道我可以将它作为字符串传递并使用反射或使用枚举,但我希望代码尽可能低维护,以便可以开发插件而无需触及应用程序的核心。

1 个答案:

答案 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)等填写。