我正在使用AutoMapper将DTO映射到实体。此外,SAP正在使用我的WCF服务。
问题是SAP向我发送空字符串而不是空字符串(即""
而不是null
)。
所以我基本上需要遍历我收到的DTO的每个字段,并用空值替换空字符串。有没有一种简单的方法可以使用AutoMapper实现这一目标?
答案 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();;