예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }