0

我有许多从服务返回的 Enum 类型,并且我想映射到我的 Enum 类型。我想要的是创建一个具有所有转换逻辑的映射器类。我做了这样的事情:

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. 保持映射枚举的整数值与原始枚举相同,这样你就可以从一个到另一个。
  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 回答