【问题标题】:Default value for all string properties when source properties are null源属性为空时所有字符串属性的默认值
【发布时间】:2021-04-28 01:52:22
【问题描述】:

是否可以使用 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; }
    ...
}

现在,MiddleName 和 FaxNumber 是 UniversalForm 类中可能为空的属性。所以我希望能够做的是,如果 FaxNumber 或 MiddleName 为空,那么在 UniversalFormDto 对象中,我希望将相应属性的值设置为“N/A”。

我知道这可以通过为每个成员创建一个映射来实现,但我想尽可能避免这种情况。

我正在寻找一种方法来为我的所有字符串属性定义一个默认值,以便在我的源对象 (UniversalForm) 上的相应属性为空时使用。

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    以下是我知道的几种方法:

    ForAllMembers

    所有属性的所有空值都将替换为"N/A"。 如果任何属性无法映射到字符串,将会崩溃:

    cfg.CreateMap<UniversalForm, UniversalFormDto>()
    .ForAllMembers(opt => opt.NullSubstitute("N/A"));
    

    会员

    每个单独属性的替代品:

    cfg.CreateMap<UniversalForm, UniversalFormDto>()
    .ForMember(dto => dto.FirstName, opt => opt.NullSubstitute("N/A"))
    ...
    ;
    

    转换使用

    任何属性中所有 null 字符串的通用替换:

    cfg.CreateMap<string, string>().ConvertUsing(s => s ?? "N/A");
    

    【讨论】:

      【解决方案2】:

      不确定发布问题时这些是否存在,但我建议使用 Value Transformer 像这样:

      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");
         }
      }
      

      【讨论】:

        【解决方案3】:

        你可以在构造函数中设置你想要的默认属性:

        public UniversalFormDto() 
        {
            FaxNumber = "N/A";
            MiddleName = "N/A";
            //etc...
        }
        

        【讨论】:

        • 如果 AutoMapper 不能做我需要做的事情,我可能会这样做。
        【解决方案4】:

        我对 AutoMapper 不太熟悉,但在做了一些研究之后,您可能想尝试对每个属性进行条件映射。

        Mapper.CreateMap<Source, Target>()
              .ForMember(dest => dest.MiddleName, 
                         opt => opt.MapFrom
                         (src => String.IsNullOrEmpty(src.MiddleName) 
                                     ? "N/A" 
                                     : src.MiddleName));
        

        希望这会有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-11-28
          • 1970-01-01
          • 2011-07-06
          • 1970-01-01
          • 2018-12-13
          • 1970-01-01
          • 2014-03-24
          • 1970-01-01
          • 2012-01-25
          相关资源
          最近更新 更多