[英]AutoMapper Enum to byte with implemention IMapperConfigurator
Enum definition is枚举定义是
public enum RowStatusEnum
{
Modified = 1,
Removed = 2,
Added = 3
}
public class RowStatusEnumConvertor : IMapperConfigurator
{
public void Cofigure()
{
Mapper.CreateMap<RowStatusEnum, byte>();
Mapper.CreateMap<byte, RowStatusEnum >();
}
}
I config autoMapper with Implemention IMapperConfigurator in RowStatusEnumConvertor class, but not work this code and not map this type, i think my config not correct or not enough, please help me我在 RowStatusEnumConvertor 类中使用实施 IMapperConfigurator 配置 autoMapper,但不能使用此代码并且不能映射此类型,我认为我的配置不正确或不够,请帮助我
thanks谢谢
Will something like this work for you?这样的事情对你有用吗?
Classes.cs类.cs
namespace StackOverflow.RowStatus
{
public enum RowStatusEnum
{
Modified = 1,
Removed = 2,
Added = 3
}
}
AutoMapperConfigurator.cs AutoMapperConfigurator.cs
namespace StackOverflow.RowStatus
{
using System;
using System.Linq;
using AutoMapper;
public class MyProfile : Profile
{
protected override void Configure()
{
Mapper.CreateMap<byte, RowStatusEnum>().ConvertUsing(
x => Enum.GetValues(typeof(RowStatusEnum))
.Cast<RowStatusEnum>().First(y => (byte)y == x));
Mapper.CreateMap<RowStatusEnum, byte>().ConvertUsing(
x => (byte)x);
}
}
}
MappingTests.cs MappingTests.cs
namespace StackOverflow.RowStatus
{
using AutoMapper;
using NUnit.Framework;
[TestFixture]
public class MappingTests
{
[Test]
public void AutoMapper_Configuration_IsValid()
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
}
[TestCase(1, Result = RowStatusEnum.Modified)]
[TestCase(2, Result = RowStatusEnum.Removed)]
[TestCase(3, Result = RowStatusEnum.Added)]
public RowStatusEnum AutoMapper_ConvertFromByte_IsValid(
byte rowStatusEnum)
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
return Mapper.Map<byte, RowStatusEnum>(rowStatusEnum);
}
[TestCase(RowStatusEnum.Modified, Result = 1)]
[TestCase(RowStatusEnum.Removed, Result = 2)]
[TestCase(RowStatusEnum.Added, Result = 3)]
public byte AutoMapper_ConvertFromEnum_IsValid(
RowStatusEnum rowStatusEnum)
{
Mapper.Initialize(m => m.AddProfile<MyProfile>());
Mapper.AssertConfigurationIsValid();
return Mapper.Map<RowStatusEnum, byte>(rowStatusEnum);
}
}
}
Starting from version 9
of Automapper there were changes in initialization which caused to be out of date above examples.从 Automapper 的第
9
版开始,初始化发生了变化,导致上述示例过时。 I updated above example and left original values to have also reference to older version (NUnit 3.12.0
):我更新了上面的示例并保留了原始值以引用旧版本(NUnit
3.12.0
):
RowStatusEnum行状态枚举
namespace StackOverflow.RowStatus
{
public enum RowStatusEnum
{
Modified = 1,
Removed = 2,
Added = 3
}
}
AutoMapperConfigurator.cs AutoMapperConfigurator.cs
namespace StackOverflow.RowStatus
{
using System;
using System.Linq;
using AutoMapper;
public class MyProfile : Profile
{
public MyProfile()
{
CreateMap<byte, RowStatusEnum>().ConvertUsing(
x => Enum.GetValues(typeof(RowStatusEnum))
.Cast<RowStatusEnum>().First(y => (byte)y == x));
CreateMap<RowStatusEnum, byte>().ConvertUsing(
x => (byte)x);
}
}
}
MappingTests映射测试
namespace StackOverflow.RowStatus
{
using AutoMapper;
using NUnit.Framework;
[TestFixture]
public class MappingTests
{
[Test]
public void AutoMapper_Configuration_IsValid()
{
var config = new MapperConfiguration(cfg => cfg.AddProfile<MyProfile>());
config.AssertConfigurationIsValid();
}
[TestCase(1, ExpectedResult = RowStatusEnum.Modified)]
[TestCase(2, ExpectedResult = RowStatusEnum.Removed)]
[TestCase(3, ExpectedResult = RowStatusEnum.Added)]
public RowStatusEnum AutoMapper_ConvertFromByte_IsValid(
byte rowStatusEnum)
{
var config = new MapperConfiguration(cfg => cfg.AddProfile<MyProfile>());
var mapper = config.CreateMapper();
return mapper.Map<byte, RowStatusEnum>(rowStatusEnum);
}
[TestCase(RowStatusEnum.Modified, ExpectedResult = 1)]
[TestCase(RowStatusEnum.Removed, ExpectedResult = 2)]
[TestCase(RowStatusEnum.Added, ExpectedResult = 3)]
public byte AutoMapper_ConvertFromEnum_IsValid(
RowStatusEnum rowStatusEnum)
{
var config = new MapperConfiguration(cfg => cfg.AddProfile<MyProfile>());
var mapper = config.CreateMapper();
return mapper.Map<RowStatusEnum, byte>(rowStatusEnum);
}
}
}
I have reproduced your problem.我已经重现了你的问题。 The solution is pretty simple, don't configure AutoMapper and set the base type of the enum to byte.
解决方法很简单,不用配置AutoMapper,把枚举的基类型设置为byte。 Like this:
像这样:
public enum RowStatusEnum : byte
{
Modified = 1,
Removed = 2,
Added = 3,
}
To let it work:让它工作:
byte x = 3;
RowStatusEnum rowStatus = Mapper.Map<RowStatusEnum>(x);
//The result will be: Added
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.