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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:42:55