2

私は単純な列挙型を持っています:

enum E
{
    FullNameForA = 1,
    A = 1,
    FullNameForB = 2,
    B = 2
}

目標は、ひねりを加えた同じ整数値に対して異なる文字列値を使用できるようにすることです。デフォルトとしてFullNameFor*を使用する必要があります。つまり、ユーザーはEAを入力として提供できますが、コードは出力にE.FullNameForAを使用する必要があります。

デフォルトでは、C#は同じ整数値を持つ要素のアルファベット順を使用するようです。これにより、私の目標は難しくなります。そうですか?これを克服する方法はありますか?

4

2 に答える 2

6

デフォルトでは、C#は同じ整数値を持つ要素のアルファベット順を使用するようです

どのような文脈で?値を文字列に戻すときは? のドキュメントからEnum.ToString:

複数の列挙型メンバーが同じ基になる値を持ち、その基になる値に基づいて列挙型メンバーの名前の文字列表現を取得しようとする場合、メソッドが返す名前についてコードで仮定を行うべきではありません。

(決定は BCL にあることに注意してください。これは言語の決定ではありません。)

各値の正規の文字列表現が必要な場合Dictionary<E, string>は、 を呼び出すのではなく、 を作成して参照することをお勧めしますToString()

于 2012-07-24T19:02:45.143 に答える
2

この代替ソリューションを検討してください。列挙型の値を DescriptionAttribute で装飾し、よりわかりやすい名前にすることができます。

enum E
{
    [System.ComponentModel.Description("FullNameForA")]
    A = 1
}

次に、その属性の値を次のように抽出できます。

public static string AsString(this Enum value)
{
    var type = value.GetType();

    if (!type.IsEnum)
        throw new ArgumentException();

    var fieldInfo = type.GetField(value.ToString());
    if (fieldInfo == null) 
        return value.ToString();

    var attribs = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false) as DescriptionAttribute[];

    return attribs.Length > 0 ? attribs[0].Description : value.ToString();
}

もちろん、これはリフレクションに依存しているため、最適なソリューションではありません。

于 2012-07-24T19:04:11.117 に答える