Dapper:结构的自定义类型处理程序

时间:2019-01-30 13:07:53

标签: .net dapper

我的目的是创建包装双精度包装的自定义结构,并使用Dapper将其保存到数据库中。不幸的是,我遇到了无法解决的问题。

我创建了以下结构:

<input matInput [matDatepicker]="enddate" placeholder="" 
(dateChange)="someMethodName($event)" formControlName="EndDate">

并添加了此处描述的自定义类型处理程序(https://medium.com/dapper-net/custom-type-handling-4b447b97c620

$mail = new \App\Email\NotifyEmail(
                'Title',
                'content');
            $mail->onQueue('email');
            \Mail::to($email)->queue($mail);

$mail = new \App\Email\NotifyEmail(
                'name',
                'gender');
            $mail->onQueue('email');
            \Mail::to($email)->queue($mail);


public function build()
    {
        return $this->subject("this is test notification email")
            ->markdown(
                'emails.notifyTest',
                [
                    'name'   => $this->name,
                    'gender' => $this->currency,
                ]
            );
    }

我的内置public struct MyDouble { private readonly double value; public static implicit operator MyDouble(double val) { return new MyDouble(val); } public static explicit operator double(MyDouble val) { return val.value; } public static explicit operator MyDouble(int val) { return new MyDouble(val); } public MyDouble(double val) { this.value = Process(val); } public double GetDouble() { return this.value; } } 属性的自定义对象:

public class MyDoubleTypeHandler : SqlMapper.TypeHandler<MyDouble>
{
    public override MyDouble Parse(object value)
    {
        return (MyDouble)value;
    }

    public override void SetValue(IDbDataParameter parameter, MyDouble value)
    {
        parameter.DbType = DbType.Double;
        parameter.Value = value.GetDouble();
    }
}

保存方法如下:

MyDouble

结果是我收到此错误:“ System.ArgumentException:不支持列'Prop1'的类型。类型为'MyDouble'”。

尽管我直接通过调用public class MyObject { public MyDouble Prop1 { get; set; } }

进行了注册,但似乎尚未注册我的自定义类型处理程序。

有人可以帮助解决这个问题吗?

P.S。我在Asp.NET Core应用程序(2.1)中使用了Dapper 1.50.5,Dapper.ParameterExtensions 2018.12.7.1

1 个答案:

答案 0 :(得分:0)

查看源代码中的测试,似乎您需要使用其他重载来设置类型处理程序:

https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L101

以及Type Handler类也略有不同:

https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/TypeHandlerTests.cs#L116

因为构造函数设置为私有,以确保通常的methon

SqlMapper.AddTypeHandler<T>(TypeHandler<T>)

不会被使用