使用枚举作为属性参数

11

这里是我想要使用的代码:

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) 时,出现了“在此处无效的枚举名称”的错误。我做错了什么,还是这个不能实现?

更多信息:

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

4个回答

17

你试图将一个类型名称作为参数值进行传递。这是不允许的。但是你可以这样做:

[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(或者更加描述性的名称)-这并不会导致错误,但更符合惯用语言。
  • 我真的不确定它的好处在哪里...你已经可以从元数据中获得属性的类型;你认为这个属性实际上给你带来了什么好处?

如果你能让我们知道你想要达到什么目的,我们可能会对你更有用。


12

在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;
    }
}

0
参数应该是一个枚举值,而不是一个枚举类型,例如:
[EnumHelper(Days.Sat)]

3
由于将Days.Sat转换为Enum时的拳击转换,这样做行不通。 - Jon Skeet
1
不会吧?我一直以为将常量值作为值类型传递到属性中是可行的。 - Philippe Leybaert

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接