1

列挙型に入れる必要がある次のコードがあります。

 10, 11, 13, AA, BB, EE

それらをC#の列挙型にしようとして苦労しています。私は現在これを持っています:

 public enum REASON_CODES { _10, _11, _13, AA, BB, CC }

しかし、数値がintではなく文字列として認識されるようにしたい:

 public enum REASON_CODES { 10, 11, 13, AA, BB, CC }

これは可能ですか、それとも私は夢を見ていますか?

4

3 に答える 3

5

列挙型とDescriptionAttribute:を使用してみてください。

public enum REASON_CODES
{
    [Description("10")]
    HumanReadableReason1,
    [Description("11")]
    SomethingThatWouldMakeSense,
    /* etc. */
}

次に、ヘルパー ( などEnumerations.GetDescription) を使用して、「実際の」値を取得できます (C# の命名制約内にとどまります)。

それを完全な答えにするために:


これら 2 つのポスターを組み合わせた拡張機能クラスが必要な場合に備えて、次のようにします。

public static class EnumExtensions
{
    public static String ToDescription<TEnum>(this TEnum e) where TEnum : struct
    {
        var type = typeof(TEnum);
        if (!type.IsEnum) throw new InvalidOperationException("type must be an enum");

        var memInfo = type.GetMember(e.ToString());
        if (memInfo != null & memInfo.Length > 0)
        {
            var descAttr = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (descAttr != null && descAttr.Length > 0)
            {
                return ((DescriptionAttribute)descAttr[0]).Description;
            }
        }
        return e.ToString();
    }

    public static TEnum ToEnum<TEnum>(this String description) where TEnum : struct
    {
        var type = typeof(TEnum);
        if (!type.IsEnum) throw new InvalidOperationException("type must be an enum");

        foreach (var field in type.GetFields())
        {
            var descAttr = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (descAttr != null && descAttr.Length > 0)
            {
                if (((DescriptionAttribute)descAttr[0]).Description == description)
                {
                    return (TEnum)field.GetValue(null);
                }
            }
            else if (field.Name == description)
            {
                return (TEnum)field.GetValue(null);
            }
        }
        return default(TEnum); // or throw new Exception();
    }
}

それで:

public enum CODES
{
    [Description("11")]
    Success,
    [Description("22")]
    Warning,
    [Description("33")]
    Error
}

// to enum
String response = "22";
CODES responseAsEnum = response.ToEnum<CODES>(); // CODES.Warning

// from enum
CODES status = CODES.Success;
String statusAsString = status.ToDescription(); // "11"
于 2013-06-18T14:19:55.970 に答える
2

残念ながら、C# では、識別子は文字またはアンダースコアで始まる必要があります。これを達成する方法はありません。あなたの最初の解決策は、あなたが得ることができる最も近いものです。

http://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx

于 2013-06-18T14:18:06.743 に答える
2

列挙値の名前は、C# の通常の変数と同じ命名規則に従う必要があります。

親切にこの質問をチェックしてください私の列挙型にわかりやすい名前を付けることはできますか?

于 2013-06-18T14:18:45.963 に答える