【问题标题】:Is it possible to add custom properties to c# enum object?是否可以将自定义属性添加到 c# 枚举对象?
【发布时间】:2017-12-18 23:45:17
【问题描述】:

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

【问题讨论】:

  • 此时不应该只使用多态而不使用枚举吗?
  • 枚举本质上是整数,你想存储一个整数、字符串和类,使用Tuple<int, string, object> tuple = new Tuple<int, string, object>(1, "First Item", new MyCustomClass(true, 1));
  • @Pierre-LucPineault 你能举个例子来说明如何做到这一点吗?
  • @MikeA 如果其中一个答案解决了您的问题,请将其标记为已解决。如果不是,请澄清现有答案中仍然缺少什么。

标签: c# enums system.componentmodel


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 2012-02-13
      相关资源
      最近更新 更多