protected DynamicParameters CreateDynParameters(object obj, Object parameters) { DynamicParameters dynParam; PropertyList properties = PropertyInfoHelper.GetProperties(obj); //Custom parameters if (parameters != null) { dynParam = new DynamicParameters(parameters); } else if (properties.Any() && properties.KeyProperty != null) { dynParam = new DynamicParameters(); foreach (PropertyInfo dataProp in properties.DataProperties) { dynParam.Add(dataProp.Name, dataProp.GetValue(obj, null)); } foreach (PropertyInfo dataObjProp in properties.DataObjectProperties) { dynamic dataObj = dataObjProp.GetValue(obj, null); if (dataObj != null) { PropertyList propObjproperties = PropertyInfoHelper.GetProperties(dataObj); if (propObjproperties.KeyProperty != null) { dynParam.Add(string.Format("{0}{1}", propObjproperties.KeyProperty.ReflectedType.Name, propObjproperties.KeyProperty.Name), propObjproperties.KeyProperty.GetValue(dataObj, null)); } } } } else { //Fallback, use all properties from the object as parameters. dynParam = new DynamicParameters(obj); } //Get key field on object if (properties.KeyProperty != null) { //Looked in Dapper source to see that it overwrites existing parameters =) dynParam.Add(properties.KeyProperty.Name, properties.KeyProperty.GetValue(obj, null), direction: ParameterDirection.InputOutput); } return(dynParam); }