当源属性为空时,所有字符串属性的默认值
本文关键字:属性 字符串 默认值 | 更新日期: 2023-09-27 18:06:30
是否可以将源对象中为空的所有字符串属性设置为使用AutoMapper的目标对象中的一些默认值?
例如,假设我有以下两个类定义:public class UniversalForm
{
public string LastName { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string FaxNumber { get; set; }
...
}
public class UniversalFormDto
{
public string LastName { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string FaxNumber { get; set; }
...
}
现在,midlename和FaxNumber是在UniversalForm类中可能为空的属性。所以我想要能够做的是,如果FaxNumber或midlename为空,那么在UniversalFormDto对象中,我希望将相应属性的值设置为"N/A"。
我知道这可以通过为每个单独的成员创建映射来完成,但如果可能的话,我希望避免这样做。
我正在寻找一种方法来定义所有我的字符串属性的默认值,当我的源对象(UniversalForm)上的相应属性为null时使用。
以下是我知道的一些方法:
ForAllMembers
所有属性上的所有空值将被替换为"N/A"
。如果任何属性不能映射到字符串,将崩溃:
cfg.CreateMap<UniversalForm, UniversalFormDto>()
.ForAllMembers(opt => opt.NullSubstitute("N/A"));
ForMember
每个单独属性的替换:
cfg.CreateMap<UniversalForm, UniversalFormDto>()
.ForMember(dto => dto.FirstName, opt => opt.NullSubstitute("N/A"))
...
;
ConvertUsing
通用替换任何属性中的所有null
字符串:
cfg.CreateMap<string, string>().ConvertUsing(s => s ?? "N/A");
不确定这些问题发布时是否存在,但我建议使用这样的值转换器:
var configuration = new MapperConfiguration(cfg => {
cfg.ValueTransformers.Add<string>(val => val ?? "N/A");
});
或者如果使用配置文件:
public class MyProfile : Profile
{
public MyProfile()
{
ValueTransformers.Add<string>(val => val ?? "N/A");
}
}
我对AutoMapper不太熟悉,但是在做了一些研究之后,您可能想尝试为每个属性进行条件映射。
Mapper.CreateMap<Source, Target>()
.ForMember(dest => dest.MiddleName,
opt => opt.MapFrom
(src => String.IsNullOrEmpty(src.MiddleName)
? "N/A"
: src.MiddleName));
你可以在构造函数中设置你想要的默认属性:
public UniversalFormDto()
{
FaxNumber = "N/A";
MiddleName = "N/A";
//etc...
}