2

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

我在 Automapper 中有一个自定义映射,它简单地将stringand转换为and 。它并没有变得更简单:bool"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);

但是,假设我想Source从 a 获取数据DataReader

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);

对于每个Dest人来说mappedIsFoo财产都是true. 我在这里想念什么?

4

2 回答 2

1

我最终放弃了stringtobool映射,而是为IMemberConfigurationExpression<IDataReader>. 扩展方法复数,因为我也遇到了这个问题,从数据库返回的数字数据与目标类型不完全匹配,导致不一致的大数字。由于数据库内容超出了我的控制范围,我不得不强制映射器将其读取为某种类型。所以这就是我最终的结果:

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 技能的人可以使它更优雅。目前,这至少有效。

于 2013-02-11T22:04:37.500 回答
0

内部IDataReader数据存储为对象而不是字符串。所以我假设AutoMapper正在评估任何不为空的东西true

于 2013-02-06T21:42:21.177 回答