19.AutoMapper 之开放式泛型(Open Generics)

开放式泛型(Open Generics)

AutoMapper可以支持开放式泛型的映射。为开放式泛型创建映射:

public class Source<T> {
    public T Value { get; set; }
}

public class Destination<T> {
    public T Value { get; set; }
}

// 创建映射
Mapper.Initialize(cfg => cfg.CreateMap(typeof(Source<>), typeof(Destination<>)));

你不需要为封闭式泛型类型创建映射。AutoMapper在运行时将应用开放式泛型映射的配置到封闭式泛型映射中:

var source = new Source<int> { Value = 10 };

var dest = mapper.Map<Source<int>, Destination<int>>(source);

dest.Value.ShouldEqual(10);

因为C#只允许封闭式泛型类型参数,所以必须使用System.Type版本的CreateMap创建你的开放式泛型映射。你可以使用所有可用的映射配置,并且开放式泛型配置将在运行时应用于封闭类型映射。AutoMapper在配置验证期间将跳过开放式泛型映射,因为之后仍然可以创建不转换的闭合类型,例如Source <Foo> - > Destination <Bar>,其中没有从Foo到Bar的转换。

你也可以创建一个开放式泛型的转换器:

Mapper.Initialize(cfg =>
   cfg.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<>)));

AutoMapper还支持具有任意数量泛型参数的开放式泛型类型转换器:

Mapper.Initialize(cfg =>
   cfg.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<,>)));

来自Source的闭合类型将是第一个泛型参数,而'Destination的闭合类型将是Converter <,>`的第二个参数。

推荐阅读更多精彩内容

  • object 变量可指向任何类的实例,这让你能够创建可对任何数据类型进程处理的类。然而,这种方法存在几个严重的问题...
    CarlDonitz阅读 687评论 0 5
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 4,381评论 0 4
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 14,674评论 2 11
  • 昨天出门路过献血车,然后就和舍友一拍即合之下去献了个血,医生问我是在经期前后吗,我说我不知道(确实,我从来不是很会...
    是卓一啊阅读 83评论 0 1
  • 初十过后,一天冷过一天,突然想起某人说的一句话:“你怕不是一个傻子吧!”想起时,总会傻笑的回复着:“是啊。” 当回...
    郑苏秦阅读 328评论 12 10
  • 粗话也需学需练,因为我不会。 人常常爱给自己和他人贴标签,这标签不仅给别人看,还常自我欣赏。 我要得体,要优雅,要...
    小茗的花花世界阅读 131评论 0 0
  • 主体:分享践行收获 3.19---3.25 主持人:王小娜 时间大臣:范叔焕 记录大臣:殷艺芳 一:主持人介绍会议...
    殷艺芳阅读 160评论 0 0