在 C# 中将已实现的接口指定为属性
Specify Implemented Interface as an Attribute in C#
我正在寻找可以确定这是否可行的人,我目前正在编写一个小型但可扩展的应用程序,它将具有插件架构。
为确保应用程序适用于当前应用程序,我使用自定义属性附加到程序集
[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' 属性 将识别适当插件的接口类型。我在库中定义了很多接口,比如ICompress、IEncrypt、ILogging等
该属性将用于分类它是哪种类型的插件,而无需为每个创建单独的属性。
我知道我可以将它作为字符串传递并使用反射,或者使用枚举,但我希望代码尽可能少维护,这样就可以在不触及核心的情况下开发插件申请。
我已经制作了多种此类插件机制,通常创建插件实例 class 并检查各种接口比在属性上定义它更容易。这将为插件实现多个接口敞开大门,这很好。
你可以像这样使用反射(假设你知道类型名称):
object plugin = Activator.CreateInstance("Assembly.Name", "Type.Class.Name");
if (plugin is ILogging)
{ ... }
if (plugin is IEncrypt)
{ ... }
对于您当前的代码,我建议您制作 Implements
属性 Type
的类型并使用 typeof(ILogging)
、typeof(IEncrypt)
填充它,等等
我正在寻找可以确定这是否可行的人,我目前正在编写一个小型但可扩展的应用程序,它将具有插件架构。
为确保应用程序适用于当前应用程序,我使用自定义属性附加到程序集
[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' 属性 将识别适当插件的接口类型。我在库中定义了很多接口,比如ICompress、IEncrypt、ILogging等
该属性将用于分类它是哪种类型的插件,而无需为每个创建单独的属性。
我知道我可以将它作为字符串传递并使用反射,或者使用枚举,但我希望代码尽可能少维护,这样就可以在不触及核心的情况下开发插件申请。
我已经制作了多种此类插件机制,通常创建插件实例 class 并检查各种接口比在属性上定义它更容易。这将为插件实现多个接口敞开大门,这很好。
你可以像这样使用反射(假设你知道类型名称):
object plugin = Activator.CreateInstance("Assembly.Name", "Type.Class.Name");
if (plugin is ILogging)
{ ... }
if (plugin is IEncrypt)
{ ... }
对于您当前的代码,我建议您制作 Implements
属性 Type
的类型并使用 typeof(ILogging)
、typeof(IEncrypt)
填充它,等等