首页 > 解决方案 > Automapper 如果源为空,则设置目标对象属性

问题描述

我有以下情况:

来源

public class AccountLogin
{
    public int UserID { get; set; }

    public bool AccountVerified { get; set; }
}

这个对象是从数据库返回的,所以如果没有找到用户,它可能是空的

目的地

public class LoginUserResponseModel
{
    public bool AccountExists { get; set; }
    public bool AccountVerified { get; set; }
    public string Status { get; set; }
    public string Token { get; set; }
}

我需要什么?
如果源为空,我需要具有以下参数的目标对象的实例:

{
    "AccountExists": false,
    "AccountVerified": false
    "Status": "Error"
    "Token": null
}

AutoMapper我放入文件的代码MappingProfile.cs如下:

 CreateMap<AccountLogin, LoginUserResponseModel>()
     .ForMember(dest => dest.AccountExists, opt => opt.MapFrom(src => src == null ? false : true))
     .ForMember(dest => dest.Status, opt => opt.MapFrom(src => src == null ? "Error" : "Ok"));

当对象不为空时,此代码工作正常,它设置Status = "Ok"AccountExists = false

当我从数据库中收到现有用户时,我的来源AccountLogin,例如: 在此处输入图像描述

所以这正确映射如下: 在此处输入图像描述

问题是当源为空时,目标也为空:

在此处输入图像描述

我有很多解决方法,但我真的很好奇这是否可以用AutoMapper.
我正在使用的项目是ASP Net Core 2.2AutoMapper v6.1.1

标签: c#asp.net-coreautomapper

解决方案


您可以尝试使用自定义 ITypeConverter 进行 ConvertUsing:

public class MyConverter : ITypeConverter<AccountLogin, LoginUserResponseModel >
{
    public int Convert(AccountLogin source, LoginUserResponseModel destination, ResolutionContext context)
    {
        return new LoginUserResponseModel{
           AccountExists = source == null ? false : true,
           AccountVerified = false,
           Status = source == null ? "Error" : "Ok",
           "Token": null
        };
    }
}

然后将其映射为:

CreateMap<AccountLogin, LoginUserResponseModel>().ConvertUsing(new MyConverter());

推荐阅读