internal static Dictionary <string, object> UpdateDataMapping <T>(T obj) where T : class, new() { var values = new Dictionary <string, object>(); var properties = (typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)).ToList(); properties.Remove(AttributeExtension.PrimaryKeyValidate(properties)); foreach (var property in properties) { try { var propertyType = property.PropertyType; //this one generally slow down the overall performance compare to dynamic method but can //safely sure that all value is going the right way var value = property.GetValue(obj); if (propertyType == typeof(string) || propertyType == typeof(char) || propertyType == typeof(char?) || propertyType == typeof(Guid) || propertyType == typeof(Guid?)) { values.Add(property.Name, value); } else if (propertyType == typeof(short) || propertyType == typeof(short?) || propertyType == typeof(int) || propertyType == typeof(int?) || propertyType == typeof(long) || propertyType == typeof(long?) || propertyType == typeof(float) || propertyType == typeof(float?) || propertyType == typeof(double) || propertyType == typeof(double?) || propertyType == typeof(ushort) || propertyType == typeof(ushort?) || propertyType == typeof(uint) || propertyType == typeof(uint?) || propertyType == typeof(ulong) || propertyType == typeof(ulong?) || propertyType == typeof(decimal) || propertyType == typeof(decimal?) || propertyType == typeof(byte) || propertyType == typeof(byte?) || propertyType == typeof(sbyte) || propertyType == typeof(sbyte?)) { //values.Add($"[{property.Name}] = {value}"); values.Add(property.Name, value); } else if (propertyType == typeof(bool) || propertyType == typeof(bool?)) { var v = (bool)value ? 1 : 0; //values.Add($"[{property.Name}] = {value}"); values.Add(property.Name, value); } else if (propertyType == typeof(DateTime) || propertyType == typeof(DateTime?)) { var v = ((DateTime)value).ToString(); //values.Add($"[{property.Name}] = '{value}'"); values.Add(property.Name, value); } } catch { continue; //skip error property } } return(values); }
/// <summary> /// Convert DbDataReader into POCO object using reflection using implicit inference (torelance for mismatch data type but slower down the building process) /// </summary> /// <typeparam name="T">typeof specific PO</typeparam> /// <param name="row">data reader to convert to POCO object</param> /// <returns></returns> public static T RowBuilder <T>(this DbDataReader row) where T : new() { object instance = new T(); var type = typeof(T); var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); foreach (var property in properties) { try { var propertyType = property.PropertyType; var propertyName = AttributeExtension.FieldNameValidate(property); //this one generally slow down the overall performance compare to dynamic method but can //safely sure that all value is going the right way var value = Convert.ToString(row[propertyName]); if (propertyType == typeof(string)) { property.SetValue(instance, value); } else if (propertyType == typeof(char) || propertyType == typeof(char?)) { property.SetValue(instance, Convert.ToChar(value)); } else if (propertyType == typeof(short) || propertyType == typeof(short?)) { property.SetValue(instance, Convert.ToInt16(value)); } else if (propertyType == typeof(int) || propertyType == typeof(int?)) { property.SetValue(instance, Convert.ToInt32(value)); } else if (propertyType == typeof(long) || propertyType == typeof(long?)) { property.SetValue(instance, Convert.ToInt64(value)); } else if (propertyType == typeof(float) || propertyType == typeof(float?)) { property.SetValue(instance, Convert.ToSingle(value)); } else if (propertyType == typeof(double) || propertyType == typeof(double?)) { property.SetValue(instance, Convert.ToDouble(value)); } else if (propertyType == typeof(ushort) || propertyType == typeof(ushort?)) { property.SetValue(instance, Convert.ToUInt16(value)); } else if (propertyType == typeof(uint) || propertyType == typeof(uint?)) { property.SetValue(instance, Convert.ToUInt32(value)); } else if (propertyType == typeof(ulong) || propertyType == typeof(ulong?)) { property.SetValue(instance, Convert.ToUInt64(value)); } else if (propertyType == typeof(bool) || propertyType == typeof(bool?)) { property.SetValue(instance, Convert.ToBoolean(value)); } else if (propertyType == typeof(decimal) || propertyType == typeof(decimal?)) { property.SetValue(instance, Convert.ToDecimal(value)); } else if (propertyType == typeof(DateTime) || propertyType == typeof(DateTime?)) { property.SetValue(instance, DateTime.Parse(value)); } else if (propertyType == typeof(Guid) || propertyType == typeof(Guid?)) { property.SetValue(instance, Guid.Parse(value)); } else if (propertyType == typeof(byte) || propertyType == typeof(byte?)) { property.SetValue(instance, Convert.ToByte(value)); } else if (propertyType == typeof(sbyte) || propertyType == typeof(sbyte?)) { property.SetValue(instance, Convert.ToSByte(value)); } } catch { continue; //skip error property } } return((T)instance); }