使用 ConvertUsingEnumMapping 定义两次的值映射枚举时出错

Error when mapping enum with a value defined twice with ConvertUsingEnumMapping

我正在尝试使用

将一个枚举值映射到另一个枚举值
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。

不,这是不可能的,这不是 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: The switch statement contains multiple cases with the label value '1'

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

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

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

输出将是:

action1

编译器任意选择第一个值。 non-unique enum values.

上有一个很好的答案

当涉及到解决您的问题时,我建议创建一个将充当 non-unique 枚举的结构。

但是,如果您了解 non-unique 枚举成员并同意,并且只是希望映射工作,那么您所要做的就是删除 CreateMap(),因为枚举映射与 AutoMapper 一起工作没有任何显式配置的约定(只要 names/values 匹配)。