使用 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 匹配)。
我正在尝试使用
将一个枚举值映射到另一个枚举值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 匹配)。