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

时间:2017-07-14 01:54:21

标签: c# enums system.componentmodel

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

我已使用Description Attribute将英语说明添加到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
}

或使用班级

bool IsTheSameCellValue(int column, int row)
{
    DataGridViewCell cell1 = dataGridView1[column, row];
    DataGridViewCell cell2 = dataGridView1[column, row - 1];
    if (cell1.Value == null || cell2.Value == null)
    {
       return false;
    }
    return cell1.Value.ToString() == cell2.Value.ToString();
}

2 个答案:

答案 0 :(得分: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;

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

答案 1 :(得分:0)

您可以使用自定义属性修饰元素。那些几乎可以包含你想要的任何东西。

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

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