- 支持递归引用的映射
- 支持部分集合的转换,包含:
T[]//数组,如果作为目标对象的属性,必须是可写属性
//以下集合,如果目标对象的属性不为null,直接覆盖元素,否则新建一个新的对象赋值到成员
IList<T>
List<T>
ICollection<T>
HashSet<T>
ISet<T>
Queue<T>
Stack<T>- 配置映射规则
- 支持通过成员名称匹配规则映射
- 支持忽略成员
CodeMapper.Mapper.Config(config =>
{
//指定映射引用类型属性的最大深度
config.ReferencePropertyHandle = CodeMapper.Metas.ReferencePropertyHandle.Depth;
//指定映射引用类型属性的最大深度为10
config.MaxDepth = 10;
//默认true,如果设置为false,需要为类型指定转换规则
config.BindWhenNeed = true;
//成员名称匹配规则映射
config.SetNameMatching((x, y) =>
{
if(x.Equals(y, StringComparison.OrdinalIgnoreCase))
return true;
if(x + "Model" == y)
return true;
if(y + "Model" == x)
return true;
if(x.Replace("Models", "s") == y)
return true;
if(y.Replace("Models", "s") == x)
return true;
return false;
});
// 全局忽略时间戳字段
config.GlobalIgnore<IModel>(x=>x.RowVersion);
});- 支持通过自定义转换函数映射
CodeMapper.Mapper.BindCustom<Model1, Model2>(b => new Model2
{
ID = b.ID,
ByteInt = 1
}); - 支持通过表达式映射成员
CodeMapper.Mapper.Bind<Model1, Model2>(b =>
{
//表达式映射
b.Bind(x => x.Name, x => x.Name + "111");
b.Bind(x => x.Name2, x => "111");
//成员映射
b.Bind(x => x.Name3, x => x.Name4);
//忽略成员
b.Ignore(x => x.ID);
});- ReferencePropertyHandle
/// <summary> 忽略 </summary>
Ignore,
/// <summary> 映射到指定深度 </summary>
Depth,
/// <summary> 循环映射(通过字典) </summary>
Loop类型转换时优先使用自定义转换方法
通过Bind方法指定的映射会覆盖全局忽略
通过Bind方法指定映射规则时未指定的目标成员,使用全局成员名称匹配规则
简单类型通过.Net默认的转换方法
集合对象通过集合操作方法转换
普通类对象的映射通过ExpressionTree构建转换方法
部分类和代码参考了TinyMapper