public static Dictionary <string, ReflectedValueInfo> GetPropertiesAndValuesForObject(object valueObject) { var publicProps = new Dictionary <string, ReflectedValueInfo>(); var t = valueObject.GetType(); var bindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly; var props = t.GetProperties(bindingFlags); foreach (var prop in props) { var valueInfo = new ReflectedValueInfo() { IsNullableType = prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>), IsPrivate = prop.PropertyType.IsPublic, Name = prop.Name, Value = prop.GetValue(valueObject) }; // Override strings to be a nullable type if (prop.PropertyType == typeof(string)) { valueInfo.IsNullableType = true; valueInfo.ValueType = typeof(string); } else if (valueInfo.IsNullableType) { // If the value type is nullable, get its underlying type valueInfo.ValueType = prop.PropertyType.GetGenericArguments()[0]; } else { valueInfo.ValueType = prop.PropertyType; } if (valueInfo.Value == null) { valueInfo.IsNull = true; } publicProps.Add(valueInfo.Name, valueInfo); } return(publicProps); }
/// <summary> /// Adds a parameter to the given parameter collection, serialising to the types respective DB type, performing serialisation as needed /// </summary> /// <param name="paramName"></param> /// <param name="reflectedValueInfo"></param> /// <param name="queryParameters"></param> private void AddValueToQueryParameters(string paramName, ReflectedValueInfo reflectedValueInfo, SQLiteParameterCollection queryParameters) { if (reflectedValueInfo.IsNull == true) { queryParameters.AddWithValue(paramName, DBNull.Value); } else if (reflectedValueInfo.ValueType == typeof(DateTime)) { queryParameters.AddWithValue(paramName, DateTimeToISO8601String((DateTime)reflectedValueInfo.Value)); } else if (reflectedValueInfo.ValueType == typeof(DateTimeOffset)) { queryParameters.AddWithValue(paramName, DateTimeOffsetToString((DateTimeOffset)reflectedValueInfo.Value)); } else if (reflectedValueInfo.ValueType == typeof(decimal)) { queryParameters.AddWithValue(paramName, ValueToLosslessDecimal((decimal)reflectedValueInfo.Value)); } else if (reflectedValueInfo.ValueType == typeof(TimeSpan)) { queryParameters.AddWithValue(paramName, TimeSpanToString((TimeSpan)reflectedValueInfo.Value)); } else if (reflectedValueInfo.ValueType == typeof(Guid)) { queryParameters.AddWithValue(paramName, reflectedValueInfo.Value.ToString()); } else if (reflectedValueInfo.ValueType == typeof(uint)) { var byteValue = BitConverter.GetBytes((uint)reflectedValueInfo.Value); queryParameters.AddWithValue(paramName, byteValue); } else if (reflectedValueInfo.ValueType == typeof(ulong)) { var byteValue = BitConverter.GetBytes((ulong)reflectedValueInfo.Value); queryParameters.AddWithValue(paramName, byteValue); } else if (reflectedValueInfo.ValueType == typeof(char)) { // Chars are stored as a byte pair BLOB to reduce string conversions queryParameters.AddWithValue(paramName, BitConverter.GetBytes((char)reflectedValueInfo.Value)); } else { queryParameters.AddWithValue(paramName, reflectedValueInfo.Value); } }