2011-12-29 80 views
2

下面是它現在的樣子。 DestinationA和DestinationB源自某個DestinationBase類。我需要忽略所有這些派生類的一些常見屬性。無論如何應用這些忽略選項全球而不必重複所有派生的目標類別?如何在AutoMapper中全局使用Ignore?

Mapper.CreateMap<SourceA, DestinationA>() 
     .ForMember(d => d.PropA, opt => opt.Ignore()) 
     .ForMember(d => d.PropB, opt => opt.Ignore()) 
     .ForMember(d => d.PropC, opt => opt.Ignore()); 

Mapper.CreateMap<SourceB, DestinationB>() 
     .ForMember(d => d.PropA, opt => opt.Ignore()) 
     .ForMember(d => d.PropB, opt => opt.Ignore()) 
     .ForMember(d => d.PropC, opt => opt.Ignore()); 

我期待這樣的事情:

Mapper.CreateMap<DestinationBase>().ForAllSource() 
     .ForMember(d => d.PropA, opt => opt.Ignore()) 
     .ForMember(d => d.PropB, opt => opt.Ignore()) 
     .ForMember(d => d.PropC, opt => opt.Ignore()); 

回答

0

見IgnoreAllNonExisting()擴展由schdr這裏:
AutoMapper: "Ignore the rest"?

public static IMappingExpression<TSource, TDestination> 
    IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
{ 
    var sourceType = typeof (TSource); 
    var destinationType = typeof (TDestination); 
    var existingMaps = Mapper.GetAllTypeMaps().First(x => x.SourceType.Equals(sourceType) && x.DestinationType.Equals(destinationType)); 
    foreach (var property in existingMaps.GetUnmappedPropertyNames()) 
    { 
     expression.ForMember(property, opt => opt.Ignore()); 
    } 
    return expression; 
} 

用法:

Mapper.CreateMap<SourceType, DestinationType>() 
       .IgnoreAllNonExisting(); 
+0

謝謝,拉米。這有幫助。但是我仍然認爲它很危險,因爲它不僅忽略了你定義的屬性,而且還忽略了所有未映射的屬性。也許我必須稍微調整一下。謝謝 –

+0

@Nay是的,我做了類似的事情,我們默默地記錄了產品中的任何價值,我們讓它在我們的本地構建中突破。 – Anicho

2

現在有一種方法FindTypeMapFor這使得該擴展方法更小(更高效?):

public static IMappingExpression<TSource, TDestination> IgnoreAllNonMapped<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression) 
    { 
     foreach (var property in Mapper.FindTypeMapFor<TSource, TDestination>().GetUnmappedPropertyNames()) 
     { 
      expression.ForMember(property, opt => opt.Ignore()); 
     } 
     return expression; 
    } 
2

我有同樣的問題和碰到這個老問題就來了,同時尋找幫助。我最終提出了以下解決方案。也許這對別人有幫助......

我有幾個從基類派生的類。我想從基類派生的任何類的所有映射中排除該基類的屬性。創建我的映射(並沒有指定任何忽略選項),我這樣做:

foreach(var map in Mapper.GetAllTypeMaps()) 
{ 
    if (typeof(MyBaseClass).IsAssignableFrom(map.DestinationType)) 
    { 
     var propInfo = map.DestinationType.GetProperty("PropertyToIgnore"); 
     if (propInfo != null) 
      map.FindOrCreatePropertyMapFor(new AutoMapper.Impl.PropertyAccessor(propInfo)).Ignore(); 
     } 
    } 
} 

這是一個有點蠻力,因爲我經歷了所有類型的地圖有循環,但它能夠完成任務。

+0

Thiks很多...搜索你的解決方案後數小時救了我 –

+0

很好的解決方案。這當然不得不手動忽略您可能定義的每個映射的屬性。我想知道AutoMapper是否有計劃的任何官方解決方案。 – Squall

+0

什麼版本的AutoMapper。我收到錯誤,'GetAllTypeMaps'和'Impl'不存在。 –

0

您可以全局忽略所有未映射的屬性。 雖然這違背automapper的主要好處,允許只作明確的映射: 這是Automapper 6:

var mapperConfiguration = new MapperConfiguration(cfg => 
    { 
     cfg.AddProfile(new MyProfile()); 
     // ignore all unmapped properties globally 
     cfg.ForAllMaps((map, exp) => exp.ForAllOtherMembers(opt => opt.Ignore())); 
    });