如何在泛型中使用AutoMapper的CreateMap方法?
泛型场景下AutoMapper CreateMap的使用方法
我来帮你梳理下结合你现有的FieldOfT<TType>泛型类和自定义类型转换器,如何配置AutoMapper的CreateMap方法:
1. 先确认核心结构(补全你未写完的转换器逻辑示例)
你的基础泛型类和转换器可以完善为:
- 泛型容器类:
public class FieldOfT<TType> { public TType Value { get; set; } public bool Foo { get; set; } public int Bar { get; set; } } - 自定义泛型类型转换器:
public class FieldOfTTypeConverter<TType, TFieldOfTType> : ITypeConverter<TType, TFieldOfTType> where TFieldOfTType: FieldOfT<TType>, new() { public TFieldOfTType Convert(TType source, TFieldOfTType destination, ResolutionContext context) { if (destination == null) { destination = new TFieldOfTType(); } // 核心赋值:将源类型的值传递给FieldOfT的Value属性 destination.Value = source; // 可根据业务需求设置Foo、Bar的默认值或自定义逻辑 destination.Foo = true; // 示例默认值 destination.Bar = 0; // 示例默认值 return destination; } }
2. 推荐:开放泛型映射配置(一次适配所有TType)
AutoMapper支持开放泛型的映射配置,不用为每个具体的TType(比如string、int)单独编写CreateMap,完美适配你的泛型场景:
var mapperConfig = new MapperConfiguration(cfg => { // 配置开放泛型规则: // 任意TType类型,都转换为对应的FieldOfT<TType> // 并自动匹配对应的FieldOfTTypeConverter<TType, FieldOfT<TType>>转换器 cfg.CreateMap(typeof(object), typeof(FieldOfT<>)) .ConvertUsing(typeof(FieldOfTTypeConverter<,>)); });
这里的关键细节:
typeof(FieldOfT<>)是开放泛型类型(未指定具体类型参数)typeof(FieldOfTTypeConverter<,>)也是开放泛型转换器- AutoMapper会自动根据实际转换的类型,匹配对应的泛型参数(比如转换
string时,自动使用FieldOfTTypeConverter<string, FieldOfT<string>>)
3. 验证配置并实际使用
配置完成后,建议先验证配置的正确性,提前规避运行时错误:
// 验证映射配置(可选但强烈推荐) mapperConfig.AssertConfigurationIsValid(); // 创建Mapper实例 var mapper = mapperConfig.CreateMapper(); // 实际转换示例 // 将string转换为FieldOfT<string> var sourceStr = "Hello AutoMapper"; FieldOfT<string> fieldStr = mapper.Map<FieldOfT<string>>(sourceStr); // 将int转换为FieldOfT<int> var sourceInt = 42; FieldOfT<int> fieldInt = mapper.Map<FieldOfT<int>>(sourceInt);
4. 特定类型的自定义配置(可选)
如果某些TType需要特殊处理,你可以在开放泛型配置的基础上,单独为该类型添加更具体的规则,AutoMapper会优先使用具体配置:
cfg.CreateMap<int, FieldOfT<int>>() .ConvertUsing(new FieldOfTTypeConverter<int, FieldOfT<int>>()) // 针对int类型额外配置Foo、Bar的赋值逻辑 .ForMember(dest => dest.Foo, opt => opt.MapFrom(src => src > 0)) .ForMember(dest => dest.Bar, opt => opt.MapFrom(src => src * 2));
内容的提问来源于stack exchange,提问作者cSteusloff
相关产品推荐
相关产品推荐

