c# - 使用 Automapper 在 DataReader 中将字符串转换为 bool 值

标签 c# .net automapper

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

我在 Automapper 中有一个自定义的 stringbool 映射,它只需转换 "Y""N" > 为 truefalse。它并没有变得更简单:

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 中的每个DestIsFoo 属性为true。我在这里缺少什么?

最佳答案

我最终放弃了 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 技能的人可以使之变得更加优雅。目前,这至少有效。

关于c# - 使用 Automapper 在 DataReader 中将字符串转换为 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14739173/

相关文章:

c# - 使用 Automapper 将域对象转换为 ViewModel,反之亦然

c# - 添加 .ToArray 或 .ToList 是否总能使数据库查询更快?

c# - 为什么 SQLite 告诉我 "No current row"?

c# - Newtonsoft.json 程序集包版本不匹配

c# - 在 Google(日历事件).Net API 中获取 "Show me"可用/忙碌值

c# - 如何使用 Autofac 注入(inject) AutoMapper?

c# - 我应该将 XSLT 文件放在我的 ASP.NET Web 应用程序的 App_Data 文件夹中吗?

.net - 如何使用 VSTS 构建包含 .NET Standard 项目和 .NET 4.7 项目的 .NET 解决方案?

c# - .net 核心中的 CPU 使用率(至少在 Windows 上)

c# - 映射对象时如何将自定义逻辑应用于AutoMapper?