2

在代码中重复ConfigurationPropertyAttribute三个名称真的很困扰我。
很容易错过拼写错误或复制/粘贴属性而忘记更新名称的一个实例。

声明一个常数只能解决其中一个问题。有没有更好的办法?

我尝试了反射,但枚举属性似乎更麻烦,更丑陋。

[ConfigurationProperty("port", DefaultValue = (int)0, IsRequired = false)]
[IntegerValidator(MinValue = 0, MaxValue = 8080, ExcludeRange = false)]
public int Port
{
    get
    {
        return (int)this["port"];
    }
    set
    {
        this["port"] = value;
    }
}

我知道 DRY 只是一个原则,在现实世界中,原则必须让位于实用主义。但我敢肯定有人有更清洁的方式?

4

2 回答 2

3

如果需要,您可以对配置元素使用非声明性方法。可以在整个 Internet 上找到示例 - 特别是在Unraveling the Mysteries of .NET 2.0 Configuration中,示例同时显示了这两种方法。

class MyConfigurationElement : ConfigurationElement
{
    private static ConfigurationPropertyCollection _properties = new ConfigurationPropertyCollection();
    private static ConfigurationProperty _portProperty = new COnfigurationProperty("port", ..... ); // Will leave as example for you to add validator etc.

    static MyConfigurationElement()
    {
         _properties.Add(_portProperty);
    }

    protected override ConfigurationPropertyCollection Properties
    {
        get { return _properties; }
    }

    public int Port  
    {
        get
        {
            return (int)this[_portProperty];
        }
        set
        {
           this[_portProperty] = value;
        }
    }    
}
于 2012-05-03T18:27:49.173 回答
2

为什么使用常数不能解决所有三个问题?

例子:

class MyConfigurationElement : ConfigurationElement
{

    // Use public, private or internal, as you see fit.
    private const string PortName = "port";

    // Add something like this, if you also want to access the string value
    // and don't want to recompile dependend assemblies when changing the
    // string 'port' to something else.
    // public static readonly PortNameProperty = PortName;

    [ConfigurationProperty(PortName, DefaultValue = (int)0, IsRequired = false)]
    [IntegerValidator(MinValue = 0, MaxValue = 8080, ExcludeRange = false)] 
    public int Port  
    {
        get
        {
            return (int)this[PortName];
        }
        set
        {
           this[PortName] = value;
        }
    }    
}

旁注:如果您还可以考虑使用配置部分设计器。坦率地说,我几年前才测试过它,从那以后就再也没有使用过,但也许它也解决了你对 DRY 的担忧。

于 2012-05-03T18:14:09.777 回答