gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:47:41 25 4
gpt4 key购买 nike

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

我在 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 map 而不是为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com