2

これは非常に単純な質問のように思われるので、うまくいけばこれは簡単になるでしょう。

Automapperでマップする習慣stringがあります。boolこれは単にandtoとに"Y"変換"N"trueますfalse。それほど単純にはなりません。

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からデータを取得したいとします。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);

のすべてについてDestmappedプロパティIsFootrueです。ここで何が欠けていますか?

4

2 に答える 2

1

結局、マップを破棄しstringbool代わりにの拡張メソッドを作成しましたIMemberConfigurationExpression<IDataReader>。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)));
    }
}

文字列としてのプロパティ名の重複は私の穀物に反しますが、Automapperのスキルが高い人がそれをよりエレガントにすることができると思います。今のところ、これは少なくとも機能します。

于 2013-02-11T22:04:37.500 に答える
0

データの内部にはIDataReader、文字列ではなくオブジェクトとして保存されます。したがってAutoMapper、null以外のものをとして評価していると仮定しますtrue

于 2013-02-06T21:42:21.177 に答える