这似乎是一个非常简单的问题,所以希望这会很容易。
我在 Automapper 中有一个自定义的 string
到 bool
映射,它只需转换 "Y"
和 "N"
> 为 true
和 false
。它并没有变得更简单:
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);
对于mapped
中的每个Dest
,IsFoo
属性为true
。我在这里缺少什么?
最佳答案
我最终放弃了 string
至bool
映射并为 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 技能的人可以使之变得更加优雅。目前,这至少有效。
关于c# - 使用 Automapper 在 DataReader 中将字符串转换为 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739173/