// we want to call list.Add(ParamInfo.Create(string name, DbType type, object val))
DbTypedbType=LookupDbType(prop.PropertyType);
if(dbType==DbType.Xml)
{
// this actually represents special handling for list types;
il.Emit(OpCodes.Ldarg_0);// stack is now [parameters] [command]
il.Emit(OpCodes.Ldstr,"@"+prop.Name);// stack is now [parameters] [command] [name]
il.Emit(OpCodes.Ldloc_0);// stack is now [parameters] [command] [name] [typed-param]
il.Emit(OpCodes.Callvirt,prop.GetGetMethod());// stack is [parameters] [command] [name] [typed-value]
if(prop.PropertyType.IsValueType)
{
il.Emit(OpCodes.Box,prop.PropertyType);// stack is [parameters] [command] [name] [boxed-value]
}
il.EmitCall(OpCodes.Call,typeof(SqlMapper).GetMethod("PackListParameters"),null);// stack is [parameters]
continue;
}
il.Emit(OpCodes.Dup);// stack is now [parameters] [parameters]
il.Emit(OpCodes.Ldarg_0);// stack is now [parameters] [parameters] [command]
il.EmitCall(OpCodes.Callvirt,typeof(IDbCommand).GetMethod("CreateParameter"),null);// stack is now [parameters] [parameters] [parameter]
il.Emit(OpCodes.Dup);// stack is now [parameters] [parameters] [parameter] [parameter]
il.Emit(OpCodes.Ldstr,"@"+prop.Name);// stack is now [parameters] [parameters] [parameter] [parameter] [name]
il.EmitCall(OpCodes.Callvirt,typeof(IDataParameter).GetProperty("ParameterName").GetSetMethod(),null);// stack is now [parameters] [parameters] [parameter]
il.Emit(OpCodes.Dup);// stack is now [parameters] [parameters] [parameter] [parameter]
EmitInt32(il,(int)dbType);// stack is now [parameters] [parameters] [parameter] [parameter] [db-type]
il.Emit(OpCodes.Dup);// stack is now [list] [list]
il.EmitCall(OpCodes.Callvirt,typeof(IDataParameter).GetProperty("DbType").GetSetMethod(),null);// stack is now [parameters] [parameters] [parameter]
il.Emit(OpCodes.Ldstr,prop.Name);// stack is [list] [list] [name]
il.Emit(OpCodes.Ldc_I4,(int)LookupDbType(prop.PropertyType));// stack is [list] [list] [name] [dbtype]
il.Emit(OpCodes.Ldloc_0);// stack is [list] [list] [name] [dbtype] [typed-param]
il.Emit(OpCodes.Callvirt,prop.GetGetMethod());// stack is [list] [list] [name] [dbtype] [typed-value]
il.Emit(OpCodes.Dup);// stack is now [parameters] [parameters] [parameter] [parameter]
EmitInt32(il,(int)ParameterDirection.Input);// stack is now [parameters] [parameters] [parameter] [parameter] [dir]
il.EmitCall(OpCodes.Callvirt,typeof(IDataParameter).GetProperty("Direction").GetSetMethod(),null);// stack is now [parameters] [parameters] [parameter]
il.Emit(OpCodes.Dup);// stack is now [parameters] [parameters] [parameter] [parameter]
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] [typed-value]
boolcheckForNull=true;
if(prop.PropertyType.IsValueType)
{
il.Emit(OpCodes.Box,prop.PropertyType);// stack is [list] [list] [name] [dbtype] [untyped-value]
il.Emit(OpCodes.Box,prop.PropertyType);// stack is [parameters] [parameters] [parameter] [parameter] [boxed-value]