用过TinyMapper,也接触过AutoMapper,然后网上查了一下,感觉都不太适合自己用。再查询mapper轮子的时候偶然看到了HigLabo.Mapper
源码地址:https://github.com/higty/higlabo/tree/master
怎么加入到你的项目
neget包搜索HigLabo.Mapper,这里要注意的是不是获取最新的包哦,需要根据的项目版本来安装你的版本,例如的项目是.net6.0那就是安装6.*.*.*的版本。
简单使用
1、default mapper HigLabo.Mapper在类上扩展了Map方法 使用的是ObjectMapper.Default,默认深拷贝。
var mapper = new ObjectMapper();
//mapper.Config.ClassPropertyCreateMode = ClassPropertyCreateMode.NewObject;
var dt0 = new DateOnlyTimeOnlyStringClass();
dt0.Date = "2000-1-1";
dt0.Time = "12:00:00";
var dt1 = dt0.Map(new DateOnlyTimeOnlyNullableClass());
Assert.AreEqual(new DateOnly(2000, 1, 1), dt1.Date);
Assert.AreEqual(new TimeOnly(12, 0, 0), dt1.Time);
2、custom mapper 手动创建ObjectMapper,并创建规则等,
var mapper = new ObjectMapper();
//mapper.Config.ClassPropertyCreateMode = ClassPropertyCreateMode.NewObject;
var dt0 = new DateOnlyTimeOnlyNullableClass();
dt0.Date = new DateOnly(2000, 1, 1);
var dt1 = dt0.Map(new DateOnlyTimeOnlyClass());
Assert.AreEqual(new DateOnly(2000, 1, 1), dt1.Date);
3、使用范围,可以是自定义对象,dynamic,ExpandObject等任何对象。
4、ReplaceMap,不会mapping其他属性,需要map的属性在方法手动加上。(只映射需要的属性,相单于手动赋值)
var mapper = new ObjectMapper();
mapper.ReplaceMap<User, User>((source, target) =>
{
target.Decimal = Decimal.Parse(source.Value);
return target;
});
var u1 = new User();
u1.Value = "23.456";
var u2 = mapper.Map(u1, new User());
5、AddPostAction 可以在自动映射的基础上,在手动修改映射关系。
var mapper = new ObjectMapper();
mapper.AddPostAction<User, User>((source, target) =>
{
target.DayOfWeekNullable = DayOfWeekConverter(source.Value);
});
var u1 = new User();
u1.Value = "Fri";
var u2 = mapper.Map(u1, new User());
6、PropertyMatchRule 映射规则,可以自定义规则,在规则方法中可以自由配对source和target的属性,需要注意的是一旦target的属性匹配到后,之后就会偏历到了。所以要慎重使用。例如下代码,NullableVectors==Vectors && p1.Name == p2.Name规则下, 优先偏历到了(vertors到vertors),然后(NullableVectors到Vectors)就无法生效了。
//规则目标匹配到了,不在匹配,
mapper.CompilerConfig.PropertyMatchRule = (c1, p1, c2, p2) =>
{
Trace.WriteLine($"{p1.Name}===>{p2.Name}");
return p1.Name == p2.Name
|| (p1.Name == "NullableVectors" && p2.Name == "Vectors");
};
var l1 = new VectorInfo();
l1.NullableVectors.Add(new Vector2() { X = 1, Y = 2 });
var l2 = mapper.Map(l1, new VectorInfo());