0

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

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

    }
    ... (other stuff here)
}

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

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

    }
}

由于我很少为自己的应用程序使用属性,所以我想知道第二种方法是否会导致更抽象的实现,或者总的来说,与我的第一种方法相比,它是否具有优势。

4

1 回答 1

1

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

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

例如我的插件看起来像这样:

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

您可以使用反射执行它而无需实例化插件,从而实现与使用属性相同的效果。我更喜欢这种方法的属性,因为它感觉更具声明性,但这很可能只是个人品味。

于 2012-09-30T11:41:10.507 回答