Ejemplo n.º 1
0
        /// <summary>
        /// Если недоступен generic-метод
        /// </summary>
        /// <param name="reader"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        private object FillFromReader(Type type, IDataReader reader)
        {
            Type resType = Nullable.GetUnderlyingType(type) ?? type;

            if (IsSimple(resType))
            {
                return(ReadSimple(type, reader));
            }
            var res = resType.GetConstructor(new Type[] { }).Invoke(new object[] { });

            foreach (var propertyInfo in type.GetProperties())
            {
                var propName = propertyInfo.Name;
                if (!CheckColumnExists(reader, propName))
                {
                    continue;
                }
                var dbValue = reader[propName];
                if (dbValue is DBNull)
                {
                    propertyInfo.SetValue(res, null);
                    continue;
                }
                bool isJson = propertyInfo.PropertyType == typeof(Dictionary <string, string>);
                if (isJson)
                {
                    var dict = DataContractSerializeHelper.DeserializeJson(Convert.ToString(dbValue));
                    propertyInfo.SetValue(res, dict);
                }
                else if (propertyInfo.PropertyType.IsEnum)
                {
                    var value = Enum.Parse(propertyInfo.PropertyType, Convert.ToString(dbValue));
                    propertyInfo.SetValue(res, value);
                }
                else
                {
                    Type t = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;
                    if (t.IsEnum)
                    {
                        var value = Enum.Parse(t, Convert.ToString(dbValue));
                        propertyInfo.SetValue(res, value);
                    }
                    else
                    {
                        object safeValue = Convert.ChangeType(dbValue, t);
                        propertyInfo.SetValue(res, safeValue);
                    }
                }
            }
            return(res);
        }