Color.Red不能是Attribute中的参数

时间:2013-11-26 10:28:57

标签: c# colors attributes

我有一个像这样的cs类:

public class MyClass
{
    [DefaultValue(Color.Red)]
    public Color MyColor{get;set;}
}

编译器始终返回错误CS0182:  属性参数必须是属性参数类型

的常量表达式,typeof表达式或数组创建表达式

我怎么了?

T_T

5 个答案:

答案 0 :(得分:1)

使用此:

[DefaultValue ( typeof ( Color ), "255, 0, 0" )]

但这不是一种好的做法:How to set the default value of Colors in a custom control in Winforms?

答案 1 :(得分:1)

答案 2 :(得分:1)

如前所述,Color.Red不是常量表达式。如果您打算使用PropertyGrid之类的内容,则可以通过添加ShouldSerialize*Reset*方法来实现此目的:

public class MyClass
{
    public MyClass()
    {
        ResetMyColor();
    }
    public Color MyColor { get; set; }

    private bool ShouldSerializeMyColor() {  return MyColor != Color.Red; }
    private void ResetMyColor() { MyColor = Color.Red; }
}

如果您打算使用XmlSerializer,那么ShouldSerialize*必须公开(Reset*不使用XmlSerializer):

public class MyClass
{
    public MyClass()
    {
        MyColor = Color.Red;
    }
    public Color MyColor { get; set; }

    public bool ShouldSerializeMyColor() {  return MyColor != Color.Red; }
}

答案 3 :(得分:0)

除RGB值外,您还可以使用字符串:

[DefaultValue(typeof(Color), "Red")]
public Color MyColor{ get; set; }

答案 4 :(得分:0)

我也遇到了属性的这个问题,其中 Color 不能是可选的构造函数参数,原因在这里解释。

我已经通过使用 System.Drawing.KnownColor 解决了这个问题,它是一个 enum

public MyCustomAttribute(string someValue, int otherValue, KnownColor foreColor = KnownColor.Black)
{
    ...
    SomeControl.ForeColor = Color.FromKnownColors(foreColor);
}

唯一的缺点是您只能使用已知颜色(命名颜色),但这些还包括所有系统定义的颜色,如 WindowText、ControlText 等。