0

サービスから返され、列挙型にマップしたい列挙型がたくさんあります。私が欲しいのは、すべての変換ロジックを持つマッパークラスを作成することです。私はこのようなことをしました:

public static class ErrEnumMapper
{
    private static Dictionary<FullErrorTypeError, eError> dictionary;

    static ErrEnumMapper()
    {
        var dictionary = new Dictionary<FullErrorTypeError, eError>()
        {
            {FullErrorTypeError.APP, eError.APPLICATION},
            {FullErrorTypeError.INF, eError.INF},
            {FullErrorTypeError.NO, eError.NONE},
            {FullErrorTypeError.PAX, eError.PASSENGER},
            {FullErrorTypeError.SYS, eError.SYSTEM}
        };
    }

    public static eError GetEnum(FullErrorTypeError key)
    {
        var val = dictionary[key];
        if (val != null)
            return val;

        throw new InvalidOperationException();
    }
}

しかし、他にも多くの列挙型があるので、この方法で、多くの静的フィールド(「辞書」フィールドなど)とそれに相当するメソッド(「GetEnum」など)を作成する必要があります...これを行うためのより良い方法はありますか?ジェネリックかも?

4

2 に答える 2

2

両方の列挙型セットの整数値または名前が同じでない限り、ある種の手動マッピングなしでは、ある列挙型値から別の列挙型値に転置することはできません。

いくつかの提案:

  1. 可能であれば元の列挙型を再利用します
  2. マップされた列挙型の整数値を元の列挙型と同じに保つと、1つの列挙型から別の列挙型にキャストできます。
  3. 列挙型の名前に規則を使用して、一方から他方にマップできるようにします。
  4. 相関する元の列挙値を示す、マップされた各列挙値にカスタム属性を使用し、ErrEnumMapperその属性を読み取りました。まだ手動マッピング、おそらく再編成されました。

もちろん、KISSの精神では、私は#1、#2に固執するか、手動マッピングを扱います。

于 2012-10-17T09:09:44.547 に答える
0

たぶん私はあなたが何を意味するのか本当に理解していないかもしれません..しかし、それらが同じ基本的な価値を持っているなら、あなたはそれらを明示的にキャストすることができます:

enum FirstEnum {
    ONE,
    TWO,
    THREE
}

enum SecondEnum {
    FOUR,
    FIVE,
    SIX
}

static void Main(string[] args) {
    FirstEnum first = FirstEnum.ONE;

    SecondEnum second = (SecondEnum)first;

    Console.WriteLine(second); // prints FOUR
}

これにより、命名規則を維持できます。

于 2012-10-17T09:04:08.680 に答える