映射工具HigLabo.Mapper的简单使用

用过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());

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值