【问题标题】:Using an Enum as an Attribute Argument使用枚举作为属性参数
【发布时间】:2009-09-15 18:15:50
【问题描述】:

这是我想使用的代码:

public enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

[EnumHelper(typeof(Days))]
public Days DayOfWeek { get; set; }

EnumHelper 看起来像:

[AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
public class EnumHelper : Attribute
{
    public Type MyEnum { get; set; }
    public EnumHelper(Type enum)
    {
        MyEnum = enum;
    }
}

我在 EnumHelper(Days) 上遇到的错误是“此时枚举名称无效”。是我做错了什么,还是不能这样做?

更多信息

我正在尝试传递枚举(天),并随机取回其中一个值。

【问题讨论】:

    标签: c# enums attributes


    【解决方案1】:

    您正试图传递一个类型名称,就好像它是一个参数值。你不能那样做。但是,您可以这样做:

    [AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
    public class EnumHelper : Attribute
    {
        public Type EnumType;
        public EnumHelper(Type enumType)
        {
            EnumType = enumType;
        }
    }
    
    ...
    
    [EnumHelper(typeof(Days))]
    public Days DayOfWeek { get; set; }
    

    但是:

    • 我个人不会将EnumType 设为公共字段;让它成为一个属性。
    • 目前没有验证EnumType 实际上是一个枚举。您无法在编译时执行此操作,但您可以在执行时执行此操作。
    • 为了方便起见,应该将其命名为 EnumHelperAttribute(或者实际上更具描述性的名称)- 这不会导致错误,但更符合习惯
    • 我不确定我是否看到了好处...您已经可以从元数据中找到属性的类型;您认为该属性实际上在购买您什么?

    如果您可以让我们知道您想要完成的工作,我们可能会对您更有用。

    【讨论】:

      【解决方案2】:

      Attributes 中的参数只能是常量。 如果你想传递枚举类型,你必须只传递类型:

      [EnumHelper(typeof(Days))]
      public Days DayOfWeek { get; set; }
      
      
      [AttributeUsage(AttributeTargets.Property,AllowMultiple=true)]
      public class EnumHelper : Attribute
      {
          public Type MyEnum;
          public EnumHelper(Type enum)
          {
              MyEnum = enum;
          }
      }
      

      【讨论】:

        【解决方案3】:

        参数应该是枚举值,而不是枚举类型,比如:

        [EnumHelper(Days.Sat)]
        

        【讨论】:

        • 由于从Days.SatEnum 的拳击转换,这将不起作用。
        • 不会?我一直认为将常量值作为值类型与属性一起使用。
        【解决方案4】:

        只是想补充一下我是如何遇到这个问题并修复它的。我将我的财产命名为与我的枚举相同的名称。该代码将编译并运行,但我在 IDE 中收到一条红线错误消息。将属性名称更改为唯一名称会清除该消息。

        【讨论】:

          猜你喜欢
          • 2012-09-09
          • 1970-01-01
          • 1970-01-01
          • 2012-02-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-23
          • 1970-01-01
          相关资源
          最近更新 更多