使用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:switch语句包含标签值为"1"的多个事例

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

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

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

输出为:

action1

编译器任意选择第一个值。这里有一个关于非唯一枚举值的好答案。

当涉及到问题的解决方案时,我建议创建一个充当非唯一枚举的结构。

但是,如果您知道并同意非唯一枚举成员,并且只是想让映射工作,那么您所要做的就是删除CreateMap(),因为枚举映射按照惯例使用AutoMapper,而不需要任何显式配置(只要名称/值匹配(。

最新更新