2013-02-06 36 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'而不是没有运气。我可能刚刚搞砸了,但我不想为布尔值创建太大的映射 - 如果这甚至是一个有效的关注。 –