Automapper是否可以将字段映射到具体类

时间:2018-03-22 20:58:10

标签: c# automapper

我有一个接口,有两个继承自它的类。

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返回相应的对象。我已成功获得使用工厂创建正确的具体类的automapper,但它只会映射接口中的字段,而不是具体类中定义的任何额外字段。

我的具体类接口的映射如下所示:

cfg.CreateMap<FieldViewModel, IField>()
                .ConstructUsing(x => FieldFactory.CreateField(x.FieldType));

var iMapper = config.CreateMapper();

var field = iMapper.Map<FieldViewModel, IField>(sourceObject);

传入包含required,minimum或maximum的源类时,这些字段不会映射到新创建的具体类中。

甚至可以使用automapper吗?或者我是否需要自己映射这些字段?

1 个答案:

答案 0 :(得分:0)

经过一番研究后,看起来我缺少的是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>();

最终必须为每个派生的具体类创建地图,但是之前的地图处理确保正确的地图与数据一起映射。