2017-09-15 106 views
5

語境:AutoMapper:映射過程中忽略特定的單詞表項(S)

那裏,看起來像這樣2個大類:

public class Source 
{ 
    public Dictionary<AttributeType, object> Attributes { get; set; } 
} 

public class Target 
{ 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public List<Attribute> Attributes { get; set; } 
} 

和子/收集/枚舉類型:

public class Attribute 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

public enum AttributeType 
{ 
    Title, 
    Description, 
    SomethingElse, 
    Foobar 
} 

目前我的地圖看起來是這樣的:

CreateMap<Source, Target>() 
    .ForMember(dest => dest.Description, opt => opt.MapAttribute(AttributeType.Description)) 
    .ForMember(dest => dest.Title, opt => opt.MapAttribute(AttributeType.Title)); 

MapAttribute得到來自Dictionary的項目,並利用我提供的AttributeType,將其添加到目標集合爲(名稱&值),對象(使用嘗試獲取並返回一個空如果該鍵不存在)...

這一切我的目標設定結束的這樣看後:

{ 
    title: "Foo", 
    attributes: [ 
    { name: "SomethingElse", value: "Bar" }, 
    { name: "Title", value: "Foo"} 
    ] 
} 


問:

如何將其餘項目映射到目標類,但我需要能夠排除特定鍵(如標題或描述)。例如。 Source.Attribute在Target中具有已定義位置的項目將從Target.Attributes集合中排除,「剩餘」屬性仍將轉到Target.Attributes。

爲了更清晰(如果我的消息來源是這樣的):

{ attributes: { title: "Foo", somethingelse: "Bar" } } 

它會映射到這樣一個目標:

{ title: "Foo", attributes: [{ name: "SomethingElse", value: "Bar" }] } 

我嘗試這一點,但它不編譯,說明如下:

自定義配置僅適用於某個類型的頂級個人會員。

CreateMap<KeyValuePair<AttributeType, object>, Attribute>() 
    .ForSourceMember(x => x.Key == AttributeType.CompanyName, y => y.Ignore()) 

回答

3

它可以在映射配置前置過濾器值,一些值將甚至不會去目標 我使用automapper V6.1。1,也有一些差別,但這個想法應該是相同的)

爲了讓事情的作品我要補充KeyValuePair<AttributeType, object>Attribute映射第一(MapAttribute剛剛返回字典值)

CreateMap<KeyValuePair<AttributeType, object>, Attribute>() 
    .ForMember(dest => dest.Name, opt => opt.MapFrom(s => s.Key)) 
    .ForMember(dest => dest.Value, opt => opt.MapFrom(s => s.Value)); 

,因爲它的定義哪些屬性應該被忽略,他們會去忽略列表,在此基礎上映射將過濾掉多餘的屬性

var ignoreAttributes = new[] {AttributeType.Description, AttributeType.Title}; 
CreateMap<Source, Target>() 
    .ForMember(dest => dest.Description, opt => opt.MapFrom(s => s.MapAttribute(AttributeType.Description))) 
    .ForMember(dest => dest.Title, opt => opt.MapFrom(s => s.MapAttribute(AttributeType.Title))) 
    .ForMember(dest=>dest.Attributes, opt=> opt.MapFrom(s=>s.Attributes 
     .Where(x=> !ignoreAttributes.Contains(x.Key)))); 

根據最終的映射例子

var result = Mapper.Map<Target>(new Source 
{ 
    Attributes = new Dictionary<AttributeType, object> 
    { 
     {AttributeType.Description, "Description"}, 
     {AttributeType.Title, "Title"}, 
     {AttributeType.SomethingElse, "Other"}, 
    } 
}); 

結果將填補Titel的,說明,只是一個屬性SomethingElse

enter image description here enter image description here