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
相关产品推荐
相关产品推荐

