AutoMapper Enum to byte with implemention IMapperConfigurator

前端 未结 3 703
温柔的废话
温柔的废话 2021-02-07 11:44

Enum definition is

public enum RowStatusEnum
{
    Modified = 1,
    Removed = 2,
    Added = 3
}

public class RowStatusEnumConvertor : IMapperConfigurator
{
           


        
相关标签:
3条回答
  • 2021-02-07 12:14

    Will something like this work for you?

    Classes.cs

    namespace StackOverflow.RowStatus
    {
        public enum RowStatusEnum
        {
            Modified = 1,
            Removed = 2,
            Added = 3
        }
    }
    

    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

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-07 12:21

    Starting from version 9 of Automapper there were changes in initialization which caused to be out of date above examples. I updated above example and left original values to have also reference to older version (NUnit 3.12.0):

    RowStatusEnum

    namespace StackOverflow.RowStatus
    {
        public enum RowStatusEnum
        {
            Modified = 1,
            Removed = 2,
            Added = 3
        }
    }
    

    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);
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-07 12:27

    I have reproduced your problem. The solution is pretty simple, don't configure AutoMapper and set the base type of the enum to 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
    
    0 讨论(0)
提交回复
热议问题