【问题标题】:Custom attribute: An attribute argument must be a constant expression自定义属性:属性参数必须是常量表达式
【发布时间】:2016-01-05 13:37:01
【问题描述】:

我已经定义了一个自定义的enumDescriptionAttribute(见我之前的问题:Multiple enum descriptions

public class DescriptionWithValueAttribute : DescriptionAttribute
{
    public Decimal Value { get; private set; }

    public DescriptionWithValueAttribute(String description, Decimal value)
        : base(description)
    {
        Value = value;
    }
}

我的enum 看起来像这样:

public enum DeviceType
{
    [DescriptionWithValueAttribute("Set Top Box", 9.95m)]
    Stb = 1,
}

编译时出现如下错误:

属性参数必须是常量表达式,typeof 表达式 或属性参数类型的数组创建表达式

我也试过了:[DescriptionWithValueAttribute("Set Top Box", (Decimal)9.95)]

有什么想法吗?

【问题讨论】:

标签: c# enums compiler-errors custom-attributes


【解决方案1】:

根据this article

属性参数仅限于以下类型的常量值:

  • 简单类型(bool、byte、char、short、int、long、float 和 double)
  • 字符串
  • System.Type
  • 枚举对象(对象类型的属性参数的参数必须是上述类型之一的常量值。)
  • 上述任何类型的一维数组

因此,您不能使用十进制。用 float 或 double 替换它。其他方式 - 将值存储为字符串并解析它。

【讨论】:

    【解决方案2】:

    我已将我的自定义 enum DescriptionAttribute 更新为以下内容:

    public class DescriptionWithValueAttribute : DescriptionAttribute
    {
        public Decimal Value { get; private set; }
    
        public DescriptionWithValueAttribute(String description, Double value)
            : base(description)
        {
            Value = Convert.ToDecimal(value);
        }
    }
    

    它需要 Double 然后转换为 Decimal,因为我需要最终值作为 Decimal。按预期工作。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2014-11-13
      • 1970-01-01
      • 2017-02-24
      • 2014-11-09
      • 2011-12-05
      相关资源
      最近更新 更多