我们假设静态类DataHelper类有一个静态方法:
ok,如果我在IL中这样来调用GetSafeDbValue:
则在运行时会抛出异常而导致应用程序退出,原因在于GetSafeDbValue接收的是一个引用类型的参数,而常数 12 是值类型的,所以必须先装箱:
像上面这种情况稍加留心就可以注意到,但是在为一个object类型的属性赋值时,就不是那么明显了,这个时候仍然需要先通过box装箱值类型后,再赋值给属性,如:
public
static
object
GetSafeDbValue(
object
val)
{
if (val != null )
{
return val;
}
return DBNull .Value;
}
GetSafeDbValue用于在为DbParameter赋值前,检查要赋的值是否为null,如果是,则使用
DBNull
.Value替换。
{
if (val != null )
{
return val;
}
return DBNull .Value;
}
ok,如果我在IL中这样来调用GetSafeDbValue:
ldc.i4.s
12
call object [DataRabbit]DataRabbit.DataHelper::GetSafeDbValue( object )
call object [DataRabbit]DataRabbit.DataHelper::GetSafeDbValue( object )
则在运行时会抛出异常而导致应用程序退出,原因在于GetSafeDbValue接收的是一个引用类型的参数,而常数 12 是值类型的,所以必须先装箱:
像上面这种情况稍加留心就可以注意到,但是在为一个object类型的属性赋值时,就不是那么明显了,这个时候仍然需要先通过box装箱值类型后,再赋值给属性,如:
//
获取要赋值的IDataParameter,然后
callvaluetype[mscorlib]System.DateTime[mscorlib]System.DateTime::get_Now()
box[mscorlib]System.DateTime
callvirtinstance void [System.Data]System.Data.IDataParameter::set_Value( object )
callvaluetype[mscorlib]System.DateTime[mscorlib]System.DateTime::get_Now()
box[mscorlib]System.DateTime
callvirtinstance void [System.Data]System.Data.IDataParameter::set_Value( object )