0

我正在尝试有条件地映射两个基于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));
4

1 回答 1

2

在 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.
于 2013-09-26T19:29:19.003 回答