2012-06-06 41 views
3

對於映射中特定類型的每個成員,我想使用我的特定自定義值解析器。客戶價值解析與全球automapper,但只爲特定的地圖?

我現在這樣做的方式是爲每個需要它的成員定義這個自定義值解析器。這是目前的代碼:

我只想指定這一個,對於一個特定的地圖,但對於我所有的谷歌搜索和搜索我找不到解決方案。有任何想法嗎?注意:對於所有的映射它不是全局的,只適用於特定的映射!

下面是當前的代碼:

Mapper.CreateMap<csp_CheckSLAForPeriodByHour_Result, CheckSlaItem>() 
    // make doubles into 0 instead of null 
    .ForMember(p => p.Avg_ms, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.avg_ms)) 
    .ForMember(p => p.Mdn_ms, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.mdn_ms)) 
    .ForMember(p => p.Sla_i_wefu, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.sla_i_wefu)) 
    .ForMember(p => p.Sla_iw_efu, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.sla_iw_efu)) 
    .ForMember(p => p.Std_ms, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.std_ms)) 
    // make ints into 0 instead of null 
    .ForMember(p => p.Min_ms, opt => opt.ResolveUsing<IntValueOrZeroResolver>().FromMember(p => p.min_ms)) 
    .ForMember(p => p.Max_ms, opt => opt.ResolveUsing<IntValueOrZeroResolver>().FromMember(p => p.max_ms)) 
    ; 

,我想簡單的東西如:

Mapper.CreateMap<csp_CheckSLAForPeriodByHour_Result, CheckSlaItem>() 
.ForAllMembers().OfType(double?).ResolveUsing<DoubleValueOrZeroResolver>() 

將是任何解決這個感謝!

Brgds Rickard Robin

+0

您是否無法使目標屬性類型爲'double'(而不是'double?')。如果你這樣做,目標屬性將被初始化爲'0D',你不必擔心automapper。 –

+0

是的,這可能是一個解決方案,但即使如此 - 在這種情況下,對於這個特定的地圖,我希望這種情況發生。我可以想象多種場景,其中一個需要類似的功能。那就是在一個特定的地圖上對所有成員使用某種類型的解析器。 – imbageek

+0

你有沒有找到一個很好的解決方案呢?我現在正在處理同樣的問題。 –

回答

-1

答案是 - 你不能這樣做!你必須爲每個屬性編寫上面的代碼。

我的解決方案是刪除AutoMapper並且再也不要觸摸它。調試不值得麻煩和太難。

0

實際上有一種方法在2年前可能不是這種情況。
所以你可以取代這個:

Mapper.CreateMap<csp_CheckSLAForPeriodByHour_Result, CheckSlaItem>() 
    // make doubles into 0 instead of null 
    .ForMember(p => p.Avg_ms, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.avg_ms)) 
    .ForMember(p => p.Mdn_ms, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.mdn_ms)) 
    .ForMember(p => p.Sla_i_wefu, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.sla_i_wefu)) 
    .ForMember(p => p.Sla_iw_efu, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.sla_iw_efu)) 
    .ForMember(p => p.Std_ms, opt => opt.ResolveUsing<DoubleValueOrZeroResolver>().FromMember(p => p.std_ms)) 
    // make ints into 0 instead of null 
    .ForMember(p => p.Min_ms, opt => opt.ResolveUsing<IntValueOrZeroResolver>().FromMember(p => p.min_ms)) 
    .ForMember(p => p.Max_ms, opt => opt.ResolveUsing<IntValueOrZeroResolver>().FromMember(p => p.max_ms)) 
    ; 

有了這個:

Mapper.CreateMap<csp_CheckSLAForPeriodByHour_Result, CheckSlaItem>() 
    // make doubles into 0 instead of null 
    .ForAllMembers(opt => opt.ResolveUsing<DoubleValueOrZeroResolver>()); 

csp_CheckSLAForPeriodByHour_Result所有成員將當映射到CheckSlaItem使用DoubleValueOrZeroResolver轉換器轉換。