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>
,其中没有从 Foo
到 Bar
的转换。
你还可以创建开放泛型类型转换器:
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<,>
的第二个参数。
值解析器也遵循相同的理念。可以查看 测试代码。