6

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

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

所以我基本上需要检查我收到的 DTO 的每个字段,并用空值替换空字符串。有没有一种简单的方法可以使用 AutoMapper 完成此任务?

4

4 回答 4

14

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

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

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

于 2020-04-09T21:45:53.207 回答
5

取决于您所追求的 - 如果有字符串字段您想保留空字符串而不转换为 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);
        }
    }
}
于 2013-05-16T16:29:14.750 回答
4

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

cfg.CreateMap<string, string>()
    .ConvertUsing(s => string.IsNullOrWhiteSpace(s) ? null : s);
于 2018-07-12T08:26:07.603 回答
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();;
于 2021-03-09T08:46:32.173 回答