是否可以将自定义属性添加到c#enum对象?

是否可以将自定义属性添加到c#enum对象?,c#,enums,system.componentmodel,C#,Enums,System.componentmodel,使用c#是否可以使用关联每个枚举项的属性 我使用了将英文描述添加到enum项中 为了给每个项目添加英文描述,我做了以下工作 public enum MyEnum { [Description("My First Item")] First, [Description("My Second Item")] Second, [Description("My Third Item")] Third } 然后我在我的enum中添加了一个名为GetDe

使用c#是否可以使用关联每个枚举项的属性

我使用了将英文描述添加到
enum
项中

为了给每个项目添加英文描述,我做了以下工作

public enum MyEnum
{
    [Description("My First Item")]
    First,

    [Description("My Second Item")]
    Second,

    [Description("My Third Item")]
    Third
}
然后我在我的
enum
中添加了一个名为
GetDescription()
的扩展方法,它允许我像这样获得描述

public static string GetDescription(this Enum value)
{
    Type type = value.GetType();

    string name = Enum.GetName(type, value);

    if (name != null)
    {
        FieldInfo field = type.GetField(name);
        if (field != null)
        {
            DescriptionAttribute attr = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
            if (attr != null)
            {
                return attr.Description;
            }
        }
    }

    return name;
}
但是,如果我能够分配一个类或构造一个新对象,这将对我有很大帮助

我可以/怎么做像下面这样的事情

public enum MyEnum
{
    [Description("My First Item"), new { IsFirst = true, UnitType = 1}]
    First
}
或者使用一个类

public enum MyEnum
{
    [Description("My First Item"), new MyCustomClass(true, 1)]
    First
}

您可以为此创建另一个扩展方法

public static object Create(this MyEnum enum)
{
    switch (enum)
    {
         case MyEnum.First:
              return new { IsFirst = true, UnitType = 1}];
         case MyEnum.Second:
              return new ...
         default:
              ...
    }
}
然后像这样使用它:

dynamic first = MyEnum.First.Create();
var isFirst = first.IsFirst;

<强>但您确实应该考虑创建一个工厂来创建您的对象。

您可以用自定义属性来装饰元素。这些可以包含你想要的任何东西

[AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]
public class DescriptorAttribute : Attribute
{
    public bool IsFirst { get; }
    public int UnitType { get; }

    public DescriptorAttribute(bool isFirst, int unitType)
    {
        IsFirst = isFirst;
        UnitType = unitType;
    }
}
您将按如下方式使用此选项:

public enum Test
{
    [Descriptor(isFirst: true, unitType: 2)]
    Element
}

您已经有了在问题中读取此属性的代码。

您可以。此时,您不应该只使用多态性而不使用枚举吗?枚举本质上是整数,如果要存储整数、字符串和类,请使用
Tuple Tuple=new Tuple(1,“第一项”,new MyCustomClass(true,1))@Pierre Luccinoult你能举个例子说明怎么做吗?@MikeA如果其中一个答案解决了你的问题,请将其标记为已解决。如果没有,请澄清现有答案中仍然缺少的内容。