C# 枚举到其他枚举的转换

C# 枚举到其他枚举的转换,c#,asp.net-mvc,enums,C#,Asp.net Mvc,Enums,我有许多枚举类型,它们从服务返回,并且我希望映射到我的枚举类型。 我想要的是创建一个mapper类,它拥有所有的转换逻辑。 我是这样做的: public static class ErrEnumMapper { private static Dictionary<FullErrorTypeError, eError> dictionary; static ErrEnumMapper() { var dictionary = new Dicti

我有许多枚举类型,它们从服务返回,并且我希望映射到我的枚举类型。 我想要的是创建一个mapper类,它拥有所有的转换逻辑。 我是这样做的:

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();
    }
}
公共静态类ErrEnumMapper
{
私有静态字典;
静态ErrEnumMapper()
{
var dictionary=newdictionary()
{
{FullErrorTypeError.APP,eError.APPLICATION},
{FullErrorTypeError.INF,eError.INF},
{FullErrorTypeError.NO,eError.NONE},
{FullErrorTypeError.PAX,eError.PASSENGER},
{FullErrorTypeError.SYS,eError.SYSTEM}
};
}
公共静态eError GetEnum(FullErrorTypeError键)
{
var val=字典[键];
如果(val!=null)
返回val;
抛出新的InvalidOperationException();
}
}
但是,由于我有许多其他枚举,因此,我必须以这种方式创建许多静态字段(如“dictionary”字段)及其等效方法(如“GetEnum”)……有更好的方法吗?
也许是泛型?

也许我没有真正理解你的意思。。但如果它们具有相同的基础值,则可以显式强制转换它们:

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
}

这允许您保持命名约定

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

一些建议:

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

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

    如果您想映射所有枚举1on1,为什么不直接使用它们呢?我们的域应用程序中有一个命名约定,由系统架构决定。我认为您一般无法做到这一点。如果可以确定哪个值映射到哪个其他值,则可以使用反射来实现。(您的GetEnum函数可以是泛型的,但我认为您需要一个附加的字典字典来选择给定类型的正确字典)。这就是我的想法,但我无法控制服务枚举、它们的int/order等等。