使用AutoMapper替换空字符串

时间:2013-05-16 15:32:36

标签: c# automapper

我正在使用AutoMapper将DTO映射到实体。此外,SAP正在使用我的WCF服务。

问题是SAP向我发送空字符串而不是空字符串(即""而不是null)。

所以我基本上需要遍历我收到的DTO的每个字段,并用空值替换空字符串。有没有一种简单的方法可以使用AutoMapper实现这一目标?

4 个答案:

答案 0 :(得分:7)

考虑映射器配置文件的值转换构造

 CreateMap<Source, Destination>()
.AddTransform<string>(s => string.IsNullOrEmpty(s) ? null : s);

此构造将转换所有“字符串”类型的成员,如果它们为null或为空,则将其替换为null

答案 1 :(得分:3)

取决于你的目标 - 如果有字符串字段,你想要保留空字符串而不是转换为null,或者你想要威胁所有这些字段相同。提供的解决方案是,如果您需要对它们进行相同的威胁。如果要指定要进行空转零转换的单个属性,请使用ForMemeber()而不是ForAllMembers。

转换所有解决方案:

namespace Stackoverflow
{
    using AutoMapper;
    using SharpTestsEx;
    using NUnit.Framework;

    [TestFixture]
    public class MapperTest
    {
        public class Dto
        {
            public int Int { get; set; }
            public string StrEmpty { get; set; }
            public string StrNull { get; set; }
            public string StrAny { get; set; }
        }

        public class Model
        {
            public int Int { get; set; }
            public string StrEmpty { get; set; }
            public string StrNull { get; set; }
            public string StrAny { get; set; }
        }

        [Test]
        public void MapWithNulls()
        {
            var dto = new Dto
                {
                    Int = 100,
                    StrNull = null,
                    StrEmpty = string.Empty,
                    StrAny = "any"
                };

            Mapper.CreateMap<Dto, Model>()
                  .ForAllMembers(m => m.Condition(ctx =>
                                                  ctx.SourceType != typeof (string)
                                                  || ctx.SourceValue != string.Empty));

            var model = Mapper.Map<Dto, Model>(dto);

            model.Satisfy(m =>
                          m.Int == dto.Int
                          && m.StrNull == null
                          && m.StrEmpty == null
                          && m.StrAny == dto.StrAny);
        }
    }
}

答案 2 :(得分:0)

您可以像这样定义字符串映射:

cfg.CreateMap<string, string>()
    .ConvertUsing(s => string.IsNullOrWhiteSpace(s) ? null : s);

答案 3 :(得分:0)

您也可以对属性进行具体说明。

cfg.CreateMap<Source, Dest>()()
    .ForMember(destination => destination.Value, opt => opt.NullSubstitute(string.Empty)));

请记住,如果您使用的是 ReverseMap(),请将其放在最后的位置,如以下内容

cfg.CreateMap<Source, Dest>()()
    .ForMember(destination => destination.Value, opt => opt.NullSubstitute(string.Empty)))
    .ReverseMap();;