我正在为我的应用程序创建一个插件系统,我希望这些插件公开一个易于理解的名称。该应用程序将显示可用插件的列表,在此列表中,名称必须可用。

我想让插件的开发人员很清楚他们需要做些什么才能使其插件正常工作。

当前,我正在使插件类实现一个接口(interface),并且该接口(interface)需要实现属性“ConsumerName”。但是,这要求主应用程序创建每个插件的实例,以便使用CunsumerName属性,仅用于显示列表。

public interface IDataConsumer : IDisposable
{
    string ConsumerName { get; }

    void Consume(DataRowSet rows);

    ...
}

有什么方法可以强制插件类提供元数据而无需创建每种类型的实例?

我的后备计划是在每个类上使用反射和一些Attribute,但是我不认为可以使用接口(interface)强制使用Attribute。

最佳答案

不可以,属性不能成为接口(interface)契约(Contract)的一部分。但强烈建议使用它们。

我过去做过的事情变成了一个属性,例如:

[AttributeUsage(AttributeTargets.Class)]
public class PluginNameAttribute : Attribute {
    public string ConsumerName { get; set; }
}

如果程序员选择用该属性来装饰他的类,那就太好了。如果没有,您可以依靠类名本身:
var consumerName = type.Name;
var nameAttribute = type.GetCustomAttributes(typeof(PluginNameAttribute), true)
    .FirstOrDefault() as PluginNameAttribute;
if (nameAttribute != null) {
    var attributeName = nameAttribute.ConsumerName;
    if (!string.IsNullOrEmpty(attributeName)) {
        consumerName = attributeName;
    }
}

要求插件开发人员使用该属性(如果有文档表明他们应该这样做)应该不是太多。

关于c# - 给插件类一个易于理解的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15338652/

10-15 19:15