読者です 読者をやめる 読者になる 読者になる

dapper dot netで列挙型にマッピングする

dapper

dapper dot netは列挙型へのマッピングにも対応しています。 ドキュメントには書いていないようなんですが、テストコードにはありました。

早速試してみます。

まずは列挙型のプロパティにマッピング。2つとも"Monday"と表示されます。文字列もenumにマッピングしてくれるんですね。

class QueryResult {
    public DayOfWeek DayOfWeek { get; set; }
}

// intをDayOfWeekプロパティにマッピング
var result1 = connection
    .Query<QueryResult>("select 1 as DayOfWeek;")
    .First();
Console.WriteLine(result1.DayOfWeek);   // Monday

// 文字列をDayOfWeekプロパティにマッピング
var result2 = connection
    .Query<QueryResult>("select 'Monday' as DayOfWeek;")
    .First();
Console.WriteLine(result2.DayOfWeek);   // Monday

今度は列挙型の戻り値として取得する場合。

// intをDayOfWeekとして取得
var result3 = connection
    .Query<DayOfWeek>("select 1;")
    .First();
Console.WriteLine(result3); // Monday

// 文字列をDayOfWeekとして取得
// 例外がスロー
/*
var result4 = connection
   .Query<DayOfWeek>( "select 'Monday';" )
   .First();
Console.WriteLine( result4 );
*/

こちらは文字列をマッピングできないようです。Enum.ToObjectで例外がスローされます。 文字列を列挙型プロパティにマッピングする方がどうしているのかを知りたくてソースを追ってみたんですが、途中でILGenerator.Emitとか出てきて、私にはさっぱりわかりませんでした・・・。

ソース全体はこちらに。