一緒に解決策をハックしました。私が知る限り、Dapper に特定の型の代替バインディング コードを生成するように指示する方法はないのでGetClassDeserializer
、プロパティが GUID の場合にアンボックス型を強制的に文字列にするようにメソッドを変更しました。次に、列挙型のコンストラクター呼び出しを生成するコードを再利用しました。
変更されたコード スニペットは次のとおりです (リビジョン rf6d62f91f31a の 761 行目から) :
// unbox nullable enums as the primitive, i.e. byte etc
var nullUnderlyingType = Nullable.GetUnderlyingType( item.Info.Type );
var unboxType = nullUnderlyingType != null && nullUnderlyingType.IsEnum ? nullUnderlyingType : item.Info.Type;
if( unboxType == typeof(Guid))
{
unboxType = typeof (string);
}
il.Emit( OpCodes.Unbox_Any, unboxType ); // stack is now [target][target][typed-value]
if ( ( item.Info.Type == typeof( Guid ) && unboxType == typeof( string ) )
|| ( nullUnderlyingType != null && nullUnderlyingType.IsEnum ) )
{
il.Emit( OpCodes.Newobj, item.Info.Type.GetConstructor( new[] { nullUnderlyingType ?? unboxType} ) );
}
il.Emit( OpCodes.Callvirt, item.Info.Setter ); // stack is now [target]