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

C# & .NET中使用AutoMapper映射类型时出错

问题分析与解决方案

异常原因

目标类型CommonInstanceDTO是只读结构体,所有属性仅包含get访问器,只能通过唯一的带参构造函数完成初始化。你之前的配置使用ForMember来映射属性,但AutoMapper无法对只读属性直接赋值,且默认未正确关联构造函数参数与源属性的映射关系,导致初始化失败。

解决方案

方法1:直接指定构造逻辑(推荐)

使用ConstructUsing直接定义从源类型到目标构造函数的映射逻辑,绕过AutoMapper的自动参数匹配:

public sealed class MapProfile : Profile
{
    //...
    CreateMap<CommonInstanceDTOMap, CommonInstanceDTO>()
        .ConstructUsing(src => new CommonInstanceDTO(
            new Guid(src.ID),
            src.Name.AsMemory(),
            src.Avatar.AsMemory(),
            src.Tag));
    //...
}

方法2:显式映射构造参数

如果需要更细粒度控制每个构造参数的映射规则,使用ForCtorParam指定每个参数的来源:

public sealed class MapProfile : Profile
{
    //...
    CreateMap<CommonInstanceDTOMap, CommonInstanceDTO>()
        .ForCtorParam("id", opt => opt.MapFrom(src => new Guid(src.ID)))
        .ForCtorParam("name", opt => opt.MapFrom(src => src.Name.AsMemory()))
        .ForCtorParam("avatar", opt => opt.MapFrom(src => src.Avatar.AsMemory()))
        .ForCtorParam("tag", opt => opt.MapFrom(src => src.Tag));
    //...
}

关键说明

  • ForMember仅适用于可写属性(带有set访问器),而只读结构体的属性无法通过这种方式赋值。
  • 两种方法都直接针对构造函数参数处理,确保AutoMapper能正确初始化目标结构体实例。

内容的提问来源于stack exchange,提问作者GhCauther101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:43:27