2

使用 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
}
4

2 回答 2

5

您可以使用自定义属性来装饰元素。这些几乎可以包含您想要的任何内容。

[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
}

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

于 2017-07-14T07:08:30.397 回答
0

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

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;

你真的应该考虑创建一个工厂来创建你的对象

于 2017-07-14T05:34:42.107 回答