当源属性为空时,所有字符串属性的默认值

本文关键字:属性 字符串 默认值 | 更新日期: 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...
}