使用类属性而不是const构造函数参数

时间:2012-09-30 11:26:04

标签: c# attributes custom-attributes

我制作了一个支持插件的应用程序。目前,插件的基类实现了一个抽象类,并为其提供了插件的名称(省略了东西):

public class AppExecutePlugin : APlugin
{
    public AppExecutePlugin() : base("Application Execute")
    {

    }
    ... (other stuff here)
}

现在,我正在考虑使用自定义属性命名插件(不关心语法错误):

[PluginName("Application Execute")]
public class AppExecutePlugin : APlugin
{
    public AppExecutePlugin()
    {

    }
}

由于我很少使用自己的应用程序属性,我想知道第二种方法是否会导致更抽象的实现,或者一般情况下,如果它与我的第一种方法相比具有优势。

1 个答案:

答案 0 :(得分:1)

它不会导致更抽象的实现(因为很难评估它如何影响'抽象'),但它有一些好处:

  • 您不需要实例化插件来读取元数据 - 您只需使用反射读取属性信息
  • 插件实例不需要为了拥有元数据而添加状态(即成员)
  • 您可以轻松添加其他属性,或扩展此属性,而不会污染插件界面

E.g。我的插件看起来像这样:

[Plugin("FriendlyName", Description = "..", Version = "1.0")]
[RequiresLicense("LicKey.XYZ")]
class MyPlugin : PluginBase {...}

没有属性,我需要将所有这些信息添加到基类构造函数中。当然,您可以通过插件界面中的方法来避免它,如下所示:

public static PluginInfo GetPluginInfo()
{
   return new PluginInfo() { Name = "FriendlyName",
                             Description = "..", 
                             Version = "1.0",
                             License = "lickey.XYZ" };
}

您可以使用反射执行它而无需实例化插件,从而实现与属性相同的操作。我喜欢这种方法的属性,因为它感觉更具说服力,但这可能很容易就是个人品味。