我有一个像这样的源类:
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
:
- 将 json 字符串反序列化为
ISubscriptionCriteria
对象。 - 根据
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/