2011-11-04 12 views
5

Yayın Durum göz ardı ediliyor gibi görünüyor. İşte benim Senaryo:Automapper'ın durumu göz ardı edilir

Kaynak sınıfı

public class Source 
{ 
    public IEnumerable<Enum1> Prop1{ get; set; } 

    public IEnumerable<Enum2> Prop2{ get; set; } 

    public IEnumerable<Enum3> Prop3{ get; set; } 
} 

bir byte dan çeteleler alt sınıf ve [Flags] süslenmiştir. Hedef sınıf, Enum1, Enum2 ve Enum3 gibi "toplam" bit değeri değerini gösteren özellikleri içerir. Dolayısıyla, Enumeration Enum1.value !, Enum1.Value2 ve Enum1.Value3'ü içeriyorsa, hedef Enum1.Value1'in bitsel değerini içerecektir. Enum1.Value2 | iç özellikler boş değildir ve haritalama başarılı ve doğru olarak hedef koyduğunda Enum1.Value3

Hedef sınıf

public Enum1 Prop1 { get; set; } 

    public Enum2 Prop2 { get; set; } 

    public Enum3 Prop3 { get; set; } 

AutoMapper Haritalama

Mapper.CreateMap<Source, Destination>() 
      .ForMember(m => m.Prop1, o => 
       { 
        o.Condition(c => !c.IsSourceValueNull); 
        o.MapFrom(f => f.Prop1.Aggregate((current, next) => current | next)); 
       }) 
      .ForMember(m => m.Prop2, o => 
      { 
       o.Condition(c => !c.IsSourceValueNull); 
       o.MapFrom(f => f.Prop2.Aggregate((current, next) => current | next)); 
      }) 
      .ForMember(m => m.Prop3, o => 
      { 
       o.Condition(c => !c.IsSourceValueNull); 
       o.MapFrom(f => f.Prop3.Aggregate((current, next) => current | next)); 
      }); 

haritalama çalışıyor. Ancak, üye kaynak değeri null olduğunda (Prop1 boş olduğunda, eşleştirmeyi atla) eşleştirmeyi atlamak istiyorum.

Kaynak.Prop1'in null olduğunu hata ayıklamadan görebilirsiniz. Durum tamamen göz ardı edilir ve değerin null olduğunu söyleyen istisnayı alır.

Trying to map Source to Destination. Destination property: Prop1. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. --> Value cannot be null. Parameter name: source 

Ben IsSourceValueNull Prop1 veya boş değil gerçek Kaynak sınıf için kontrol olmadığından emin değilim. Sadece üye olan Prop1 sıfırdır.

Yardımlarınız onaylanmıştır.

cevap

6

Sana iki adımda Condition ve MapFrom yapmanız gereken düşünüyorum: Durum yanlış değerlendirilirse

.ForMember(c => c.Prop1, o => o.Condition(c => !c.IsSourceValueNull)); 
.ForMember(c => c.Prop1, o => o.MapFrom(f => f.Prop1.Aggregate(...)); 

MapFrom asla kullanılmayacaktır.

DÜZENLEME

Hmmm ... Bu işe görünmüyor. Bunu daha önce bir yerlerde kullanmıştım. Sadece MapFrom başvurmak olabilir:

.MapFrom(f => f.Prop1 == null ? null : f.Prop1.Aggregate(...)); 
+0

Teşekkürler Patrick. Bunu ayırarak tam olarak aynı istisnayı alıyorum. – TimJohnson

+0

Bunu daha önce yaptığımı düşündüm. Muhtemelen bir şey, c.IsSourceValueNull'un, eşlenecek tüm kaynak nesnenin boş olup olmadığını göstermesi olabilir. "C => c.Prop1! = Null" olması gerekip gerekmediğini merak ediyorum. – PatrickSteele

+0

"Koşul" kullanarak bir kod örneği bulunamadı. Afedersiniz. Sanırım her zaman yapabiliyorsunuz: o.MapFrom (f => f.Prop1 == null? Null: f.Prop1.Aggregate (...)) – PatrickSteele

2

IMO, bu aslında AutoMapper en EnumMapper bir hata olduğunu. Durum bildirimleri, yukarıda sahip olduğunuz gibi, iyi çalışmalıdır. Örneğin, bir beton türünden başka TypeMapMapper eşleme doğru koşullu arayacak:

object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper); 

sonunda defined condition çağırır hangisi: türeşlem en ShouldAssignValue yöntemini çağırmaz

public bool ShouldAssignValue(ResolutionContext context) 
    { 
     return _condition == null || _condition(context); 
    } 

Ama EnumMapper Bu alanı gerçekten bulup bulmayacağını öğrenmek için. Benzer şekilde, AfterMap numaralı başvuruya herhangi bir başvuru göremiyorum. Bu nedenle, orada tanımlanan hiçbir şeyin işe yaramayacağı ihtimal dışıdır.

+0

Bir test çantası ile birlikte # 143 olarak yayınlandı: https://github.com/AutoMapper/AutoMapper/issues/143 –

+0

Teşekkürler. Bu mantıklı. – TimJohnson