2013-02-06 67 views
2

這看起來像是一個非常簡單的問題,所以希望這很容易。使用Automapper在DataReader中將字符串轉換爲bool

我在Automapper簡單地轉換"Y""N"truefalse定製stringbool地圖。它沒有得到更簡單:

Mapper.CreateMap<string, bool>().ConvertUsing(str => str.ToUpper() == "Y"); 

這工作正常,在這個原始的例子:

public class Source 
{ 
    public string IsFoo { get; set; } 
    public string Bar { get; set; } 
    public string Quux { get; set; } 
} 

public class Dest 
{ 
    public bool IsFoo { get; set; } 
    public string Bar { get; set; } 
    public int Quux { get; set; } 
} 

// ... 

Mapper.CreateMap<string, bool>().ConvertUsing(str => str.ToUpper() == "Y"); 
Mapper.CreateMap<Source, Dest>(); 
Mapper.AssertConfigurationIsValid(); 

Source s = new Source { IsFoo = "Y", Bar = "Hello World!", Quux = "1" }; 
Source s2 = new Source { IsFoo = "N", Bar = "Hello Again!", Quux = "2" }; 
Dest d = Mapper.Map<Source, Dest>(s); 
Dest d2 = Mapper.Map<Source, Dest>(s2); 

但是,讓我們說不是我想從DataReader採取Source數據:

Mapper.CreateMap<string, bool>().ConvertUsing(str => str.ToUpper() == "Y"); 
Mapper.CreateMap<IDataReader, Dest>(); 
Mapper.AssertConfigurationIsValid(); 

DataReader reader = GetSourceData(); 
List<Dest> mapped = Mapper.Map<IDataReader, List<Dest>>(reader); 

對於Dest in mappedIsFoo財產是true。我在這裏錯過了什麼?

回答

1

我最終放棄了stringbool地圖,而是創建了IMemberConfigurationExpression<IDataReader>的擴展方法。 擴展方法複數,因爲我也遇到了this issue,其中從數據庫返回的數字數據與目標類型完全不匹配,導致大數不一致。由於數據庫內容不在我的控制範圍之內,因此我必須強制映射器將其作爲特定類型讀取。因此,這裏是我結束了:

public static class Mapping 
{ 
    public static void Init() 
    { 
     Mapper.CreateMap<IDataReader, Dest>() 
      .ForMember(s => s.IsFoo, opt => opt.ReadAsBoolean("IsFoo")) 
      .ForMember(s => s.Quux, opt => opt.ReadAsNumber("Quux")); 

     Mapper.AssertConfigurationIsValid(); 
    } 

    public static void ReadAsBoolean(this IMemberConfigurationExpression<IDataReader> opt, string fieldName) 
    { 
     opt.MapFrom(reader => reader.GetString(reader.GetOrdinal(fieldName)).ToUpper() == "Y"); 
    } 

    public static void ReadAsNumber(this IMemberConfigurationExpression<IDataReader> opt, string fieldName) 
    { 
     opt.MapFrom(reader => reader.GetDecimal(reader.GetOrdinal(fieldName))); 
    } 
} 

屬性名稱的重複,串違背了我的糧食,但我懷疑有人用更Automapper技能可以使更多的優雅。目前來看,這至少起作用。

0

IDataReader內部,數據存儲爲對象而不是字符串。所以我假設AutoMapper正在評估任何非空作爲true

+0

我懷疑這可能是問題的一部分,並嘗試從'object'映射到'bool'而不是沒有運氣。我可能剛剛搞砸了,但我不想爲布爾值創建太大的映射 - 如果這甚至是一個有效的關注。 –