c#中如何用属性修饰枚举

本文关键字:枚举 属性 何用 | 更新日期: 2023-09-27 18:14:04

在我的解决方案中,我有一个关于助手库的enum。例如

 public enum MyEnum 
 {  
  First,
   Second 
  }

我想在一些其他项目中使用MyEnum。我想在每个项目中用自己的属性来装饰这个enum,像这样:

public enum MyEnum 
 { 
 [MyAttribute(param)] 
 First,
 [MyAttribute(param2)]
 Second 
}

如何装饰enum从另一个库与自己的本地属性?

c#中如何用属性修饰枚举

你不能做你所描述的-你能做的最好的是创建一个新的Enum使用相同的一组值。然后,无论何时使用它,都需要将其强制转换为"真实的"enum。

您可以使用T4模板或类似的方法为您生成有属性的枚举-这样会更安全,因为它很容易映射错误的值,从而产生一些非常微妙的错误!

Linqpad查询
enum PrimaryColor
{
    Red,
    Blue,
    Green
}
enum AttributedPrimaryColor
{
    [MyAttribute]
    Red = PrimaryColor.Red,
    [MyAttribute]
    Blue = PrimaryColor.Blue,
    [MyAttribute]
    Green = PrimaryColor.Green
}
static void PrintColor(PrimaryColor color)
{
    Console.WriteLine(color);
}
void Main()
{
    // We have to perform a cast to PrimaryColor here.
    // As they both have the same base type (int in this case)
    // this cast will be fine.
    PrintColor((PrimaryColor)AttributedPrimaryColor.Red);   
}

属性是编译时添加到代码中的(元数据)。在使用已编译的代码程序集时,不能修改它们。
(或者如果你是一个顽固的低级IL巫师,也许你可以,但我肯定不是…)

如果您的enum值需要在不同的地方修改或参数,那么您应该考虑其他解决方案,例如Dictionary甚至数据库表。

。使用Dictionary:

var values = new Dictionary<MyEnum, int>()
{
    { MyEnum.First, 25 },
    { MyEnum.Second, 42 }
};
var valueForSecond = values[MyEnum.Second]; // returns 42

您可以这样做,但是这会很繁琐。
这个想法是使用您的项目设置来允许在新项目中导入枚举时进行更改。

首先,你需要2个属性:
// This one is to indicate the format of the keys in your settings
public class EnumAttribute : Attribute
{
    public EnumAttribute(string key)
    {
        Key = key;
    }
    public string Key { get; }
}
// This one is to give an id to your enum field
[AttributeUsage(AttributeTargets.Field)]
public class EnumValueAttribute : Attribute
{
    public EnumValueAttribute(int id)
    {
        Id = id;
    }
    public int Id { get; }
}

那么,这个方法:

// This method will get your attribute value from your enum value
public object GetEnumAttributeValue<TEnum>(TEnum value)
{
    var enumAttribute = (EnumAttribute)typeof(TEnum)
        .GetCustomAttributes(typeof(EnumAttribute), false)
        .First();
    var valueAttribute = (EnumValueAttribute)typeof(TEnum).GetMember(value.ToString())
        .First()
        .GetCustomAttributes(typeof(EnumValueAttribute), false)
        .First();
    return Settings.Default[String.Format(enumAttribute.Key, valueAttribute.Id)];
}

我没有检查类型是否正确,即使它找到任何属性也没有。你必须这样做,否则如果你没有提供正确的类型,你会得到一个异常。

现在,你的enum看起来像这样:

[Enum("Key{0}")]
public enum MyEnum
{
    [EnumValue(0)] First,
    [EnumValue(1)] Second
}

最后,在您的项目设置中,您必须添加与枚举中成员数量相同的行数。
您必须使用与提供给EnumAttribute的参数相同的模式来命名每一行。这里,它是"Key{0}",所以:

  1. Key0:第一个值
  2. Key1:您的第二个值
  3. 等等…

像这样,你只需要改变你的设置值(不是KEY)来导入你的枚举,并将你的属性从一个项目改变到另一个项目。

用法:

/*Wherever you put your method*/.GetEnumAttributeValue(MyEnum.First);

它会返回"Your first value"