项目
版本

AutoMapper 开放泛型

AutoMapper 支持开放泛型类型映射。为开放泛型类型创建映射:

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

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

// 创建映射
var configuration = new MapperConfiguration(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.ShouldBeEquivalent(10);

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

你还可以创建开放泛型类型转换器:

var configuration = new MapperConfiguration(cfg =>
   cfg.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<>)));

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

var configuration = new MapperConfiguration(cfg =>
   cfg.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<,>)));

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

值解析器也遵循相同的理念。可以查看 测试代码

在本文档中