其中提供枚举操作方法

本文关键字:枚举 操作方法 | 更新日期: 2023-09-27 18:36:55

我有几个枚举:

public class ClassA
{
    public enum A {a, b, c, d};
    public class ClassB
    {
        public enum B {b1, b2, b3, b4};
        public enum C {c1, c2, c3};
    }
    // ...
}

现在我需要对枚举执行一些操作,例如:

  • 返回枚举的全部或部分成员的列表;

  • 将枚举转换为文本(例如,A.a应向用户显示为"条件 A",B.b1显示为"选项 1")

我的问题是组织这些方法。

有很多枚举,我需要将方法链接到其中的一些枚举

问:在哪里存储用于在应用程序中操作不同枚举的方法?

我应该为每个枚举创建一个类吗?或者使用自定义类来操作所有枚举和具有相应枚举名称的名称方法?

Enum不是一个类,它不能容纳静态方法,理想情况下我希望它们在里面。这将非常方便,每当我能够输入A.并且智能会为我提供:

a, b, c, d, A[] FilterValues(bool condition), string[] AllValuesTranslated(), string TranslateMembmer(A member)

我希望这个问题很清楚(不知道如何解释我需要更短的内容,对不起)。

其中提供枚举操作方法

以下是一些有用的实用程序扩展方法:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

用法:

var listOfValues = typeof (A).ToList();
var listOfKeyValuePairs = typeof(A).ToListOfKeyValuePair();
var dictionaryOfValues = typeof(A).ToDictionary();

给定以下枚举:

public enum A
{
    [EnumValueDescription("This is a")] a = 1,
    [EnumValueDescription("This is b")] b = 2,
    [EnumValueDescription("This is c")] c = 3,
    [EnumValueDescription("This is d")] d = 4
};

以及以下自定义属性:

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field, AllowMultiple = false)]
public class EnumValueDescriptionAttribute : Attribute
{
    public string StringValue
    {
        get;
        protected set;
    }
    public EnumValueDescriptionAttribute(string value)
    {
        this.StringValue = value;
    }
}

以及以下扩展方法:

public static class EnumExtentions
{
    public static List<Enum> ToList(this Type type)
    {
        return Enum.GetValues(type)
                    .OfType<Enum>()
                    .ToList();
    }
    public static Dictionary<int, string> ToDictionary(this Type type)
    {
        return type.GetEnumValues().Cast<Enum>().ToDictionary(Convert.ToInt32, e => e.GetDescription());
    }
    public static List<KeyValuePair<int, string>> ToListOfKeyValuePair(this Type type)
    {
        return Enum.GetValues(type)
                    .OfType<Enum>()
                    .Select(e => new KeyValuePair<int, string>(Convert.ToInt32(e), e.GetDescription()))
                    .ToList();
    }
    public static string GetDescription(this Enum value)
    {
        return value.GetDescription(null);
    }
    public static string GetDescription(this Enum value, string defaultValue)
    {
        var allFields = value.GetType().GetFields();
        if (!allFields.Any())
            return defaultValue;
        var targetField = allFields.FirstOrDefault(fi => (fi.IsLiteral && (fi.GetValue(null).Equals(value))));
        if (targetField == null)
            return defaultValue;
        var attrib = targetField.GetCustomAttributes(typeof(EnumValueDescriptionAttribute), false)
            .OfType<EnumValueDescriptionAttribute>()
            .FirstOrDefault();
        return attrib == null ? defaultValue : attrib.StringValue;
    }
}

目前还不完全清楚您需要哪些其他操作方法。