【问题标题】:Error when mapping enum with a value defined twice with ConvertUsingEnumMapping使用 ConvertUsingEnumMapping 定义的值映射枚举时出错
【发布时间】:2020-11-06 15:19:48
【问题描述】:

我正在尝试将枚举值映射到另一个使用

CreateMap<Enum1, Enum2>()
                .ConvertUsingEnumMapping(m => m.MapByName())
                .ReverseMap();

枚举是这样的

 public enum Enum1
    {
        action1 = 1,
        action2 = 2
        aliasAction1 = 1
    }

 public enum Enum2
    {
        action1 = 1,
        action2 = 2
        aliasAction1 = 1
    }

运行映射验证测试时使用

configuration.AssertConfigurationIsValid();

我收到有关枚举值键已存在的错误。即使我是按名称而不是按值进行映射。 具体

System.ArgumentException : An item with the same key has already been added. 

有没有什么方法可以在不自己手动执行的情况下执行此映射?

编辑额外信息以避免可能发生的冰雹

我知道不唯一的枚举值是不受欢迎的,并且不惜一切代价避免,但是,枚举是由第三方提供的,我需要将其转换为 proto 以供内部使用,因此需要使用 Automapper 进行映射.

【问题讨论】:

    标签: c# .net-core automapper


    【解决方案1】:

    不,这不可能,也不是 AutoMapper 的错。

    如果您尝试在没有 AutoMapper 的情况下手动映射它,它或多或少看起来像下面这几行。一个开关,从一个枚举到另一个枚举。

    public Enum2 Convert(Enum1 source)
    {
        switch (source)
        {
            case Enum1.action1:
                return Enum2.action1;
            case Enum1.action2:
                return Enum2.action2;
            case Enum1.aliasAction1:
                return Enum2.aliasAction1;
            default:
                throw new NotSupportedException();
        }
    }
    

    但是等等...编译器似乎对aliasAction1 的情况有问题:

    case Enum1.aliasAction1:
        return Enum2.aliasAction1;
    

    CS0152:switch 语句包含标签值为“1”的多个案例

    这是因为 switch 语句已经定义了值1 的路径,即action1。即使编译器允许您编写这样的开关,aliasAction1 的情况也将无法访问,因为值 1 的情况已经在前面定义,因此所有值为1 的枚举成员都将在第一种情况下正确.

    让我们为Enum1 声明一个变量并将其值设置为aliasAction1

    var enumValue = Enum1.aliasAction1;
    Console.WriteLine(enumValue);
    

    输出将是:

    action1
    

    编译器任意选择第一个值。这是non-unique enum values 上的一个很好的答案。

    当谈到解决您的问题时,我建议创建一个将充当非唯一枚举的结构。

    但是,如果您知道非唯一枚举成员并没有问题,并且只是希望映射正常工作,那么您所要做的就是删除 CreateMap(),因为枚举映射按照约定与 AutoMapper 一起工作,无需任何显式配置(只要名称/值匹配)。

    【讨论】:

    • 枚举由第三方提供,我需要将其转换为 proto 类以供内部使用,因此避免使用非唯一枚举是不可能的。但我感谢您的帮助
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2015-06-26
    • 1970-01-01
    • 2016-09-08
    • 2013-02-04
    相关资源
    最近更新 更多