2013-09-26 148 views
0

我試圖根據ExtendedField.type有條件映射兩個對象。所以如果類型是textbox那麼我會映射到TextBox類,但如果它是checkbox那麼我會映射到Checkbox類。當然這需要擴展以映射到其他IHtmlElement派生類型。使用Automapper動態映射

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,但我想不出如何動態地告訴AutoMapper其具體類映射到基於關閉type屬性。

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)); 

回答

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; 
     } 
    } 

映射:

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

謝謝你,我真的很喜歡這個想法,但我沒有自由來改變':使用

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

例子ExtendedField.type'值是要映射到的類的標準名稱。 – bflemi3

+0

mb您可以創建幫助程序,它將包含帶有「textbox」,「checkbox」等字符串的私有字典作爲鍵,具體類型爲值和公共方法,並將其作爲參數變成字符串並返回\t 映射的必要類型。在ExtFieldToIHtmlElementConverter中進行一些更改。看到這裏的例子:http://pastebin.com/8neMdXhb – alxndr

+0

是的,這正是我正在考慮的impl :) – bflemi3