我正在尝试根据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));
答案 0 :(得分:2)
在Extended Field.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.