为插件类提供一个人类可读的名称

Pet*_*ell 8 c# plugins interface

我正在为我的应用程序创建一个插件系统,我希望插件能够显示一个人类可读的名称.应用程序将显示可用插件的列表,在此列表中需要提供名称.

我想让插件的开发人员清楚地知道他们需要做些什么来使他们的插件工作.

目前我正在使插件类实现一个接口,并且接口需要实现一个属性"ConsumerName".但是,这需要主应用程序创建每个插件的实例,以便使用CunsumerName属性,只是为了显示列表.

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

    void Consume(DataRowSet rows);

    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有办法强制插件类提供元数据而不创建每种类型的实例?

我的后备计划是在每个类上使用反射和一些属性,但我不认为可以使用接口强制属性.

ken*_*ken 4

不可以,属性不能成为接口契约的一部分。但强烈推荐它们。

我过去所做的就是创建一个属性,例如:

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

如果程序员选择用该属性来装饰他的类,那就太好了。如果没有,您可以依靠类名本身:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果有记录表明插件开发人员应该使用该属性,那么要求插件开发人员使用该属性应该不算太多。