C# 使用Automapper在DataReader中将字符串转换为布尔值
这似乎是一个非常简单的问题,所以希望这会很容易 我在Automapper中有一个自定义的C# 使用Automapper在DataReader中将字符串转换为布尔值,c#,.net,automapper,C#,.net,Automapper,这似乎是一个非常简单的问题,所以希望这会很容易 我在Automapper中有一个自定义的字符串到bool映射,它可以简单地将“Y”和“N”转换为真和假。这并没有变得更简单: Mapper.CreateMap<string, bool>().ConvertUsing(str => str.ToUpper() == "Y"); 对于映射的中的每个Dest,IsFoo属性为true。这里缺少什么?在IDataReader中,数据存储为对象,而不是字符串。因此,我假设AutoMapp
字符串
到bool
映射,它可以简单地将“Y”和“N”转换为真
和假
。这并没有变得更简单:
Mapper.CreateMap<string, bool>().ConvertUsing(str => str.ToUpper() == "Y");
对于映射的中的每个Dest
,IsFoo
属性为true
。这里缺少什么?在IDataReader
中,数据存储为对象,而不是字符串。因此,我假设AutoMapper
将任何不为null的值计算为true
我最终放弃了字符串
到bool
映射,而是为IMemberConfigurationExpression
创建扩展方法。扩展方法是复数的,因为我还遇到了从DB返回的数字数据与目标类型不完全匹配的情况,导致了不一致的大数字。由于数据库内容超出了我的控制范围,我不得不强制映射程序将其作为特定类型读取。这就是我的结局:
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)));
}
}
公共静态类映射
{
公共静态void Init()
{
Mapper.CreateMap()
.ForMember(s=>s.IsFoo,opt=>opt.ReadAsBoolean(“IsFoo”))
.ForMember(s=>s.quox,opt=>opt.ReadAsNumber(“quox”));
assertConfigurationsValid();
}
公共静态void ReadAsBoolean(此IMemberConfiguration表达式opt,字符串字段名)
{
opt.MapFrom(reader=>reader.GetString(reader.GetOrdinal(fieldName)).ToUpper()==“Y”);
}
公共静态void ReadAsNumber(此IMemberConfiguration表达式opt,字符串字段名)
{
opt.MapFrom(reader=>reader.GetDecimal(reader.GetOrdinal(fieldName));
}
}
将属性名复制为字符串与我的想法背道而驰,但我怀疑拥有更多自动映射技能的人可以使其更加优雅。目前,这至少是可行的。我怀疑这可能是问题的一部分,并尝试了从对象
到布尔
的映射,但没有成功。我可能只是把这搞砸了,但我不想创建一个太广泛的布尔映射,如果这是一个合理的问题的话。
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);
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)));
}
}