如何停止Automapper将枚举值转换为字符串

时间:2015-05-08 15:37:54

标签: .net automapper automapper-3

我们的代码目前使用非常旧版本的Automapper(1.1)来更新近3.3。自动机行为的变化导致了一些问题。

我们有object类型的字段,可以采用引用类型或enum值的值。当字段值为枚举值时,Automapper将值映射到字符串表示。

请参阅下面的代码示例,它说明了我们的问题 - 有人可以告诉我如何说服Automapper将枚举值映射到目标枚举值。

提前致谢 - 克里斯

    using AutoMapper;
    using AutoMapper.Mappers;
    using NUnit.Framework;

    namespace AutoMapperTest4
    {
        [TestFixture]
        public class AutomapperTest
        {
            [Test]
            public void TestAutomapperMappingFieldsOfTypeEnumObject()
            {
                // Configure 
                var configuration = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
                var mapper = new MappingEngine(configuration);
                IMappingExpression<Source, Target> parentMapping = configuration.CreateMap<Source, Target>();
                parentMapping.ForMember(dest => dest.Value, opt => opt.MapFrom(s => ConvertValueToTargetEnumValue(s)));

                var source = new Source { Value = SourceEnumValue.Mule };

                var target = mapper.Map<Target>(source);

                Assert.That(target.Value, Is.TypeOf<TargetEnumValue>()); // Fails.  targetParent.Value is a string "Mule".
            }

            private static TargetEnumValue ConvertValueToTargetEnumValue(Source s)
            {
                return (TargetEnumValue)s.Value;
            }
        }

        public enum SourceEnumValue
        {
            Donkey,
            Mule
        }

        public enum TargetEnumValue
        {
            Donkey,
            Mule
        }

        public class Source
        {
            public object Value { get; set; }
        }

        public class Target
        {
            public object Value { get; set; }
        }
    }

1 个答案:

答案 0 :(得分:1)

您可以在每个枚举和object之间放置一个显式映射,并使用ConvertUsing(e => e)告诉AutoMapper不要弄乱该值。

这很有效,但是人们不得不这样做,而且在某些情况下很难找到放置代码的位置。

我非常有兴趣听到任何人可以建议一种方法来取回“正确”行为。