【问题标题】:Using class attributes instead of const constructor arguments使用类属性而不是 const 构造函数参数
【发布时间】:2012-09-30 11:26:03
【问题描述】:

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

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

    }
    ... (other stuff here)
}

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

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

    }
}

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

【问题讨论】:

    标签: c# attributes custom-attributes


    【解决方案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" };
    }
    

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

    【讨论】:

    • 谢谢 Zdeslav。目前唯一的缺点是我不能强制插件具有属性,而使用 const 参数是可能的。
    • 你是对的,构造方法有这个优势。好吧,编程充满了权衡。
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 2015-12-22
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多