【问题标题】:Enum conversion to other Enum枚举转换为其他枚举
【发布时间】:2012-10-17 08:54:52
【问题描述】:

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

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”)......有没有更好的方法来做这个? 通用吗?

【问题讨论】:

  • 如果你想1on1映射所有枚举,为什么不直接使用它们呢?
  • 我们的域应用程序中有一个由系统架构师规定的命名约定
  • 我不认为你可以通用。如果您通常可以确定哪个值映射到哪个其他值,则可以通过反射来做到这一点。 (你的 GetEnum 函数可能是通用的,但我认为你需要一个额外的字典来选择给定类型的正确字典)。

标签: c# asp.net-mvc enums


【解决方案1】:

除非两组枚举的整数值或名称相同,否则您不能在没有某种手动映射的情况下从一个枚举值转置到另一个枚举值。

一些建议:

  1. 尽可能重用原始枚举
  2. 保持映射枚举的整数值与原始枚举相同,这样您就可以从一个枚举转换到另一个枚举。
  3. 对枚举名称使用约定,以便您可以从一个映射到另一个。
  4. 在每个映射的枚举值上使用一个自定义属性来指示相关的原始枚举值,并让ErrEnumMapper 读取该属性。仍然是手动映射,只是可能进行了重组。

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

【讨论】:

  • 这就是我的想法,但我无法控制服务枚举、它们的 int/order 等。
【解决方案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
}

这可以让你保持你的命名约定..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多