在C#中组合属性

时间:2017-12-21 18:49:06

标签: c# attributes

我在可序列化属性对象中使用Attributes,该对象用于读取/写入我的应用程序的xml配置文件并使用Windows.Forms.PropertyGrid显示。我使用c#Attributes来实现这一点,并希望能够组合属性值,以便我的[Description]包含[DefaultSettingValueAttribute]

例如,以下是如何定义一个属性:

`[Category("General")]
[Description("Default Filename")]
[global::System.Configuration.DefaultSettingValueAttribute("sample.txt")]
public string DefaultFileName { get; set; } = "sample.txt";`

我希望能够做的是:

`[Category("General")]
[global::System.Configuration.DefaultSettingValueAttribute("sample.txt")]

[Description("Default Filename: " + 
global::System.Configuration.DefaultSettingValueAttribute]

public string DefaultFileName { get; set; } = "sample.txt";`

关于如何实现这一目标的任何建议?

1 个答案:

答案 0 :(得分:0)

至少,如果两个字符串有不同的含义,那么我就不会将它们组合起来。如果你将它们组合在一起,那么你所拥有的就是一个大字符串,并且你的代码中的任何部分都会看到该字符串必须知道如何将其解析回原始部分。

您可以轻松创建包含两个字符串的属性。例如,

public class SomeAttribute : Attribute
{
    public SomeAttribute() { }

    public SomeAttribute(string category, string description)
    {
        Category = category;
        Description = description;
    }
    public string Category { get; set; }
    public string Description { get; set; }
}

无需将它们合并。

但另一个问题是,这些值是否以某种方式相关,以便它们实际上属于同一属性?我不知道你的属性是如何使用的。但除非它们具有内在联系,否则将它们作为单独的属性保留可能会更好。如果两个字符串之间存在逻辑上的区别,请使用两个字符串,并对属性使用相同的字符串。

或许您可能想要的是一个属性从另一个继承:

public class BaseAttribute : Attribute
{
    public BaseAttribute() { }

    public BaseAttribute(string defaultValue = null)
    {
        DefaultValue = defaultValue;
    }
    public string DefaultValue { get; set; }
}

public class SomeAttribute : BaseAttribute
{
    public SomeAttribute() { }

    public SomeAttribute(string category, string description, string defaultValue = null)
        :base(defaultValue)
    {
        Category = category;
        Description = description;
    }
    public string Category { get; set; }
    public string Description { get; set; }
}

现在第二个属性包含自己的属性以及基本属性。