[英]Is it possible for Automapper to map fields to concrete classes
我有一个接口,有两个从其继承的类。
public interface IField
{
int FieldID { get; set; }
string FieldName { get; set; }
string FieldType { get; }
string FieldDisplayValue { get; set; }
}
public abstract class BaseField : IField
{
public int FieldID { get; set; }
public string FieldName { get; set; }
public abstract string FieldType { get; }
public string FieldDisplayValue { get; set; }
}
public class StaticText : BaseField, IField
{
public override string FieldType => "Text";
}
public class TextField : BaseField, IField
{
public override string FieldType => "TextBox";
public bool Required { get; set; }
public int MinimumLength { get; set; }
public int MaximumLength { get; set; }
public string DefaultText { get; set; }
}
我想根据传入类中包含的类型将通用类自动映射到这些类之一。
public class FieldViewModel
{
public int FieldID { get; set; }
public string FieldName { get; set; }
public string FieldType { get; set; }
public string FieldDisplayValue { get; set; }
public bool Required { get; set; }
public int MinimumLength { get; set; }
public int MaximumLength { get; set; }
public string DefaultText { get; set; }
}
我已经构造了一个工厂类,它将根据fieldType返回适当的对象。 我已经成功地获得了自动映射器,可以使用工厂来创建正确的具体类,但是它将仅映射接口中的字段,而不会映射具体类中定义的任何其他字段。
我的具体类接口图如下:
cfg.CreateMap<FieldViewModel, IField>()
.ConstructUsing(x => FieldFactory.CreateField(x.FieldType));
var iMapper = config.CreateMapper();
var field = iMapper.Map<FieldViewModel, IField>(sourceObject);
当传入包含必需,最小值或最大值的源类时,这些字段不会映射到新创建的具体类中。
automapper甚至可以做到吗? 还是我需要自己映射这些字段?
经过更多研究后,看来我缺少的是beforeMap代码。
cfg.CreateMap<FieldViewModel, IField>()
.ConstructUsing(x => FieldFactory.CreateField(x.FieldType))
.BeforeMap((s,d,c) => c.Mapper.Map(s, d));
cfg.CreateMap<FieldViewModel, StaticText>();
cfg.CreateMap<FieldViewModel, TextField>();
最终不得不为每个派生的具体类创建地图,但是before地图会处理确保正确的人被数据映射。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.