枚举转换为其他枚举



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

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")......有没有更好的方法可以做到这一点?也许是通用的?

除非两组枚举的整数值或名称相同,否则如果没有某种手动映射,则无法从一个枚举值转置到另一个枚举值。

一些建议:

  1. 如果可能,重用原始枚举
  2. 保持映射枚举的整数值与原始枚举相同,以便您可以从一个枚举强制转换为另一个枚举。
  3. 对枚举名称
  4. 使用约定,以便可以从一个枚举映射到另一个枚举名称。
  5. 对每个映射的枚举值使用指示相关原始枚举值的自定义属性,并ErrEnumMapper读取该属性。仍然是手动映射,只是可能重新组织。

当然,本着KISS的精神,我会坚持#1,#2,或者只是处理手动映射。

也许我真的不明白你的意思......但如果它们具有相同的基础值,你可以显式转换它们:

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
}

这使您可以保留命名约定。

最新更新