Dot-Net
AutoMapper 在所有欄位上應用通用/全域格式化程序?
我正在使用 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); } } }