Dot-Net

AutoMapper 在所有欄位上應用通用/全域格式化程序?

  • July 11, 2019

我正在使用 AutoMapper 3.2.1

我只是有一個要求,我的項目的消費者希望我做一些簡單的轉換——將所有字元串欄位修剪掉空格並將 null 轉換為 string.empty。

我將如何以有效的方式在 AutoMapper 中執行此操作?

例如

public class Person()
{
  public string First {get; set;}
  public string Middle {get; set; }
  public string Last {get; set; }
  public DateTime DateOfBirth {get; set; }
}

public class PersonDto()
{
  public string First {get; set;}
  public string Second {get; set; }
  public string Last {get; set; }
  public DateTime DateOfBirth {get; set; }
}

還有我的地圖範例:

Mapper.CreateMap<Person, PersonDto>().
   .ForMember(dst => dst.Second, opt => opt.MapFrom(src => src.Middle));

Mapper.CreateMap<PersonDto, Person>().
   .ForMember(dst => dst.Last, opt => opt.MapFrom(src => src.Second));

我嘗試Google尋找答案,看到有些人在使用:

Mapper.ForSourceType<string>().AddFormatter(MyCustomStringFormatter)

但似乎 AddFormatter 已經過時了?

如果您真的想將這些規則應用於所有字元串,您可以設置一個從stringto的映射string

Mapper.CreateMap<string, string>()
   .ConvertUsing(str => (str ?? "").Trim());

從一個string屬性映射到另一個屬性時,將採用此規則。

就我而言,我四處尋找可以修剪所有字元串道具的解決方案。不適用於所有現有的地圖定義,但僅適用於某些特定的地圖定義。我的解決方案:

CreateMap<Source, Destination>()
     // custom map settings...
    .ForMember(x => x.Phone, opt => opt.Ignore())
     //Trim all string props now...
    .AfterMap<TrimAllStringProperty>();

       private class TrimAllStringProperty : IMappingAction<object, object>
       {
           public void Process(object source, object destination)
           {
               var stringProperties = destination.GetType().GetProperties().Where(p => p.PropertyType == typeof(string));
               foreach (var stringProperty in stringProperties)
               {
                   string currentValue = (string)stringProperty.GetValue(destination, null);
                   if (currentValue != null)
                       stringProperty.SetValue(destination, currentValue.Trim(), null);
               }
           }
       }

引用自:https://stackoverflow.com/questions/30986877