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阅读 4,421评论 0 5
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 11,080评论 0 4
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 16,105评论 2 11
  • 昨天出门路过献血车,然后就和舍友一拍即合之下去献了个血,医生问我是在经期前后吗,我说我不知道(确实,我从来不是很会...
    是卓一啊阅读 949评论 0 1
  • 粗话也需学需练,因为我不会。 人常常爱给自己和他人贴标签,这标签不仅给别人看,还常自我欣赏。 我要得体,要优雅,要...
    小茗的花花世界阅读 1,781评论 0 0