AutoMapper 在所有字段上应用 common/global 格式化程序?
AutoMapper to apply common/global formatter on all fields?
我正在使用 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 似乎已经过时了?
如果您真的想将这些规则应用于 所有 字符串,您可以设置从 string
到 string
的映射:
Mapper.CreateMap<string, string>()
.ConvertUsing(str => (str ?? "").Trim());
从一个 string
属性 映射到另一个时,将采用此规则。
就我而言,我四处寻找可以 Trim 所有字符串道具的解决方案。不适用于所有现有的地图定义,但仅适用于某些特定的地图定义。
我的解决方案:
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);
}
}
}
我正在使用 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 似乎已经过时了?
如果您真的想将这些规则应用于 所有 字符串,您可以设置从 string
到 string
的映射:
Mapper.CreateMap<string, string>()
.ConvertUsing(str => (str ?? "").Trim());
从一个 string
属性 映射到另一个时,将采用此规则。
就我而言,我四处寻找可以 Trim 所有字符串道具的解决方案。不适用于所有现有的地图定义,但仅适用于某些特定的地图定义。 我的解决方案:
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);
}
}
}