C# 使用Automapper在DataReader中将字符串转换为布尔值

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

这似乎是一个非常简单的问题,所以希望这会很容易

我在Automapper中有一个自定义的
字符串
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)));
    }
}