如何用AutoMapper将StatusSqlModel的Id转换为UploadStatus枚举
使用AutoMapper实现StatusSqlModel到UploadStatus的枚举映射
给定以下C#类定义:
public class StatusSqlModel { public int Id { get; set; } public string Name { get; set; } } public enum UploadStatus { Created, InProgress, Succeeded, Failed, Cancelled }
需要实现映射关系:1→Created、2→InProgress、3→Succeeded、4→Failed、5→Cancelled,将StatusSqlModel的Id字段转换为UploadStatus枚举。
方法一:直接使用ConvertUsing定义转换逻辑
创建AutoMapper配置Profile,直接指定从StatusSqlModel到UploadStatus的转换规则:
public class StatusMappingProfile : Profile { public StatusMappingProfile() { CreateMap<StatusSqlModel, UploadStatus>() .ConvertUsing(model => model.Id switch { 1 => UploadStatus.Created, 2 => UploadStatus.InProgress, 3 => UploadStatus.Succeeded, 4 => UploadStatus.Failed, 5 => UploadStatus.Cancelled, _ => throw new ArgumentOutOfRangeException(nameof(model.Id), "传入的状态ID不在有效范围内") }); } }
初始化AutoMapper并执行映射:
// 初始化配置 var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile<StatusMappingProfile>(); }); var mapper = mapperConfig.CreateMapper(); // 执行映射 var sqlStatus = new StatusSqlModel { Id = 3 }; UploadStatus result = mapper.Map<UploadStatus>(sqlStatus); // result 为 UploadStatus.Succeeded
方法二:映射到包含枚举的目标类
如果需要将StatusSqlModel映射到包含UploadStatus属性的ViewModel(如StatusViewModel),可通过ForMember指定单个属性的转换逻辑:
public class StatusViewModel { public UploadStatus Status { get; set; } // 其他业务属性... } // 在Profile中配置映射 public class StatusMappingProfile : Profile { public StatusMappingProfile() { CreateMap<StatusSqlModel, StatusViewModel>() .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.Id switch { 1 => UploadStatus.Created, 2 => UploadStatus.InProgress, 3 => UploadStatus.Succeeded, 4 => UploadStatus.Failed, 5 => UploadStatus.Cancelled, _ => throw new ArgumentOutOfRangeException(nameof(src.Id), "无效的状态ID") })); } }
方法三:使用自定义ValueResolver(适合复杂逻辑)
若转换逻辑需要复用或包含更复杂的业务判断,可创建自定义解析器:
public class StatusIdToEnumResolver : IValueResolver<StatusSqlModel, object, UploadStatus> { public UploadStatus Resolve(StatusSqlModel source, object destination, UploadStatus destMember, ResolutionContext context) { return source.Id switch { 1 => UploadStatus.Created, 2 => UploadStatus.InProgress, 3 => UploadStatus.Succeeded, 4 => UploadStatus.Failed, 5 => UploadStatus.Cancelled, _ => throw new ArgumentOutOfRangeException(nameof(source.Id), "状态ID无效") }; } } // 在Profile中使用解析器 public class StatusMappingProfile : Profile { public StatusMappingProfile() { CreateMap<StatusSqlModel, StatusViewModel>() .ForMember(dest => dest.Status, opt => opt.MapFrom<StatusIdToEnumResolver>()); } }
注意事项
- 确保已通过NuGet安装AutoMapper包:
Install-Package AutoMapper或使用.NET CLI命令:dotnet add package AutoMapper - 无效ID的处理:示例中抛出异常,你可根据业务需求改为返回默认枚举值(如
UploadStatus.Created)
内容的提问来源于stack exchange,提问作者SimonD
相关产品推荐
相关产品推荐

