C# 给插件类一个人类可读的名称

C# 给插件类一个人类可读的名称,c#,plugins,interface,C#,Plugins,Interface,我正在为我的应用程序创建一个插件系统,我想让插件公开一个人类可读的名称。应用程序将显示一个可用插件的列表,在这个列表中,名称需要可用 我想让插件的开发人员非常清楚,他们需要做什么才能使插件正常工作 目前,我正在使插件类实现一个接口,该接口需要实现一个属性“ConsumerName”。但是,这需要主应用程序为每个插件创建一个实例,以便使用CunsumerName属性来显示列表 public interface IDataConsumer : IDisposable { string Con

我正在为我的应用程序创建一个插件系统,我想让插件公开一个人类可读的名称。应用程序将显示一个可用插件的列表,在这个列表中,名称需要可用

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

目前,我正在使插件类实现一个接口,该接口需要实现一个属性“ConsumerName”。但是,这需要主应用程序为每个插件创建一个实例,以便使用CunsumerName属性来显示列表

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

    void Consume(DataRowSet rows);

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

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

通常我会说“没有”。这是因为有两种机制允许在不需要创建实例的情况下从类型中提取信息:
static
members和attributes。因为这些机制和接口之间没有重叠,所以您不能同时满足所有声明的需求


但是,基于属性的解决方案有什么问题?当然,您不能在编译失败时强制属性的存在,但您可以在加载插件(甚至更早)时这样做。

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

我过去所做的是将其作为一个属性,例如:

[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;
    }
}

如果有文件证明插件开发人员应该使用该属性,那么要求插件开发人员使用该属性应该不过分。

您应该从所述插件附带的配置文件中读取插件的名称。非常简单。让插件开发人员发现属性类本身的好方法是什么?@PeterHenell-正如Jon所说,如果插件类没有用属性修饰,那么总是有可能抛出异常。这样,当开发人员第一次测试他的插件时,他会立即知道它是必需的。如果这听起来太极端了,那么好的文档可能就是答案。抛出异常可能是我最后要做的事情,或者在应用程序中有某种调试窗口来显示此类信息。