使用自动映射器动态映射
本文关键字:映射 动态 | 更新日期: 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.