il.Emit(OpCodes.Dup);// stack is now [parameters] [[parameters]] [parameter] [parameter]
EmitInt32(il,(int)dbType);// stack is now [parameters] [[parameters]] [parameter] [parameter] [db-type]
if(dbType==DbType.Object&&prop.PropertyType==typeof(object))// includes dynamic
{
// look it up from the param value
il.Emit(OpCodes.Ldloc_0);// stack is now [parameters] [[parameters]] [parameter] [parameter] [typed-param]
il.Emit(OpCodes.Callvirt,prop.GetGetMethod());// stack is [parameters] [[parameters]] [parameter] [parameter] [object-value]
il.Emit(OpCodes.Call,typeof(SqlMapper).GetMethod("GetDbType",BindingFlags.Static|BindingFlags.Public));// stack is now [parameters] [[parameters]] [parameter] [parameter] [db-type]
}
else
{
// constant value; nice and simple
EmitInt32(il,(int)dbType);// stack is now [parameters] [[parameters]] [parameter] [parameter] [db-type]
}
il.EmitCall(OpCodes.Callvirt,typeof(IDataParameter).GetProperty("DbType").GetSetMethod(),null);// stack is now [parameters] [[parameters]] [parameter]