You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在泛型中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:05:14