2017-09-15 79 views
5

Bağlam:AutoMapper: haritalama sırasında belirli sözlük kalem (ler) Ignore

Orada şuna benzer 2 ana sınıfları:

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

Ve alt/koleksiyon/Enum türü:

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

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

Şu benim Haritası şuna benzer:

, Dictionary öğeyi ve sağladığımız AttributeType kullanarak alır anahtar yoksa boş bir olsun denemek kullanarak ve geri dönen (bir (isim & değeri) olarak hedef koleksiyonuna ekler nesne

) ... benim Hedef set uç doldu bu gibi bakarak Sonuçta bu

:

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


Soru:

Öğelerin kalanını hedef sınıfla eşleme hakkında nasıl giderim, ancak belirli anahtarları (başlık veya açıklama gibi) hariç tutabilmem gerekir. ÖRNEĞİN. Hedefte tanımlanmış bir yere sahip Source.Attribute öğeleri Target.Attributes koleksiyonundan hariç tutulur ve "left-over" özellikleri hala Target.Attributes'a gider. daha da Anlaşılır olması için

(böyle kaynağım görünüyorsa): Böyle bir hedefe karşılık gelecek

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

: Ben bu teşebbüs ettik

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

ama Aşağıdakileri belirterek derleme yapmaz:

Özel yapılandırma Üyeler için sadece bir tür üst düzey bireysel üyeler için desteklenir.

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

cevap

3

Bazı değerler bile v6.1 automapper kullanıyorum hedefe gitmek olmaz, haritalama yapılandırmasına ön filtresi değerlerine mümkündür.1, bazı fark vardır ama fikir şeyler yapmak için

onu tanımlanan olarak ben ilk KeyValuePair<AttributeType, object>-Attribute eşleme (MapAttribute sadece sözlük değer döndürür)

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

eklemek zorunda çalışır) aynı olmalıdır hangi göz ardı edilmelidir niteliklerini, öldürecekler fazlalığı filtrelemek hangi haritalama dayalı liste görmezden gider niteliklerini son haritalama örnekdayanarak

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"}, 
    } 
}); 

sonuç Başlık, Açıklama doldurulmuş ve sadece bir özellik

enter image description here enter image description here

olarak başka şeyler olacak