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

    // ...
}

次に、列挙型を使用していくつかの操作を実行する必要があります。たとえば、次のようになります。

  • enum のすべてまたは一部のメンバーのリストを返します。

  • 列挙型をテキストに変換します (たとえば、「オプション 1」A.aのように「条件 A」としてユーザーに表示する必要があります)。B.b1

そして、私の問題は、それらの方法を整理することです。

多くの列挙型があり、それらのいくつかにメソッドをリンクする必要があります

質問: アプリケーション内でさまざまな列挙型を操作するメソッドをどこに保存すればよいですか?

列挙ごとにクラスを作成する必要がありますか? または、カスタム クラスを使用してすべての列挙型を操作し、対応する列挙型名でメソッドに名前を付けますか?

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 に答える