0

我有几个枚举:

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)

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

4

1 回答 1

1

以下是一些可以提供帮助的实用程序扩展方法:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~

用法:

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

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

于 2013-10-25T13:23:12.830 回答