我正在尝试使用将一个枚举值映射到另一个
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,而不需要任何显式配置(只要名称/值匹配(。