c# - AutoMapper - 将 Json 字符串属性映射到基于接口(interface)的对象

标签 c# automapper automapper-6

我有一个像这样的源类:

public partial class Source
{
    ...
    public int ScheduleBaseId { get; set; }
    public int ScheduleIncrement { get; set; }
    public int SubscriptionTypeId { get; set; } // <- Determines the concrete class to map to
    public string SubscriptionCriteriaJson { get; set; } // <- Map to interface class
    ...
}

我正在映射到这个目标类:

public class Dest
{
    ...
    public Schedule Schedule { get; set; }
    public ISubscriptionCriteria SubscriptionCriteria { get; set; }
    ...
}

我想将 Source.SubscriptionCriteriaJson 属性映射到使用接口(interface)的 Dest.SubscriptionCriteria。接口(interface)的具体类可以使用Source.SubscriptionTypeId 确定。我试图在此处同时解决两个问题以映射到 SubscriptionCriteria:

  1. 将 json 字符串反序列化为 ISubscriptionCriteria 对象。
  2. 根据 SubscriptionTypeId 映射到 ISubscriptionCriteria 的正确具体类型。

有什么想法/指示我如何在 AutoMapper 中实现这一点吗?我是 AutoMapper 的新手,所以仍在摸索。

这是我到目前为止所掌握的其余映射:

var config = new MapperConfiguration(
    cfg => cfg.CreateMap<Source, Dest>()
        .ForMember(dest => dest.Schedule, opt => { opt.MapFrom(src => new Schedule((ScheduleBaseEnum)src.ScheduleBaseId, src.ScheduleIncrement)); })
    );

最佳答案

我通过以下方式解决了这个问题:

public class AutoMapperProfileConfiguration : Profile
{
    public AutoMapperProfileConfiguration()
        : this("MyProfile")
    {
    }

    protected AutoMapperProfileConfiguration(string profileName)
        : base(profileName)
    {
        CreateMap<Source, Dest>()
            .ForMember(dest => dest.Schedule, opt =>
            {
                opt.MapFrom(src => new Schedule((ScheduleBaseEnum)src.ScheduleBaseId, src.ScheduleIncrement));
            })
            .ForMember(dest => dest.SubscriptionCriteria, opt =>
            {
                opt.MapFrom(src => (ISubscriptionCriteria)JsonConvert.DeserializeObject(src.SubscriptionCriteriaJson, GetSubscriptionCriteriaType((SubscriptionTypeEnum)src.SubscriptionTypeId)));
            });
    }

    private Type GetSubscriptionCriteriaType(SubscriptionTypeEnum type)
    {
        switch (type)
        {
            case SubscriptionTypeEnum.SomeType1:
                return typeof(SomeType1);
            case SubscriptionTypeEnum.SomeType2:
                return typeof(SomeType2);
            ...
            default:
                throw new NotImplementedException(string.Format("SubscriptionType of {0} is not implemented.", Enum.GetName(typeof(SubscriptionTypeEnum), type)));
        }
    }
}

如果您能想到更优雅的解决方案,请分享,我很想学习!

关于c# - AutoMapper - 将 Json 字符串属性映射到基于接口(interface)的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45093451/

相关文章:

c# - Datagridview复选框单元格更改按钮和画线的颜色

c# - 如何从 docusign 检索已签名的用户文档?

c# - Automapper 帮助映射复杂的 c# 对象

c# - Automapper 将 ICollection<T> 映射到单个具体对象

c# - P/调用 const char 指针和 int 引用

c# - MVC 应用程序中的 SSRS 身份验证

c# - 在多个项目中配置 AutoMapper

c# - 无法将字符串转换为 TimeSpan

automapper - 在自动映射器中为所有类型的成员配置约定

asp.net-core - Automapper 和 EF 导航属性