使用自动映射器动态映射

本文关键字:映射 动态 | 更新日期: 2023-09-27 18:32:51

我正在尝试根据ExtendedField.type有条件地映射两个对象。因此,如果类型是textbox,那么我会映射到TextBox类,但如果它是checkbox,那么我会映射到Checkbox类。当然,这需要开放扩展以映射到其他IHtmlElement派生类型。

Mapper.Map<IEnumerable<ExtendedField, IEnumerable<IHtmlElement>>(extendedFields);

对象示例:

public class ExtendedField {
    public string type { get; set; }
    public string prompt { get; set; }
    public string value { get; set; }
}
public Interface IHtmlElement {
    string label { get; set; }
    string type { get; set; }
    string value { get; set; }
}
public class TextBox : IHtmlElement {
    public string label { get; set; }
    public string type { get { return "textbox"; } }
    public string value { get; set; }
}
public class CheckBox : IHtmlElement {
    public string label { get; set; }
    public string type { get { return "checkbox"; } }
    public string value { get; set; }
}

我已经创建了要映射到IHtmlElement的映射,但我想不出如何根据 type 属性动态告诉 AutoMapper 要映射到哪个具体类。

Mapper.CreateMap<ExtendedField, IHtmlElement>()
      .ForMember(dest => dest.label, opt => opt.MapFrom(src => src.prompt))
      .ForMember(dest => dest.type, opt => opt.MapFrom(src => src.type))
      .ForMember(dest => dest.value, opt => opt.MapFrom(src => src.extendedFieldValue));

使用自动映射器动态映射

在 ExtendedField.type 中,您必须包含完整的限定类型名称。写入类型转换器:

public class ExtFieldToIHtmlElementConverter : TypeConverter<ExtendedField, IHtmlElement>
    {
        protected override IHtmlElement ConvertCore(ExtendedField source)
        {
            var obj = Activator.CreateInstance(Type.GetType(source.type)) as IHtmlElement;
            obj.label = source.prompt;
            obj.value = source.value;
            return obj;
        }
    }

映射:

mapper.CreateMap<ExtendedField, IHtmlElement>().ConvertUsing<ExtFieldToIHtmlElementConverter>();

使用示例:

var element = Mapper.Map<IHtmlElement>(extFieldObj); // become instance that implement IHtmlElement interface.