使用Automapper动态映射

时间:2013-09-26 15:41:55

标签: c# conditional automapper

我正在尝试根据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));

1 个答案:

答案 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.