zoukankan      html  css  js  c++  java
  • DataReader转换

    public static partial class Extension
        {
            
            private static ConcurrentDictionary<Type, ConcurrentDictionary<string, PropertyInfo>> typePropertyCache = new ConcurrentDictionary<Type, ConcurrentDictionary<string, PropertyInfo>>();
    
            private static ConcurrentDictionary<string, PropertyInfo> GetTypePropertyMap(Type entityType)
            {
                if (typePropertyCache.ContainsKey(entityType))
                    return typePropertyCache[entityType];
                ConcurrentDictionary<string, PropertyInfo> propertyMappers = new ConcurrentDictionary<string, PropertyInfo>();
                var properties = entityType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty);
                foreach (var item in properties)
                {
                    string columnName = ImprovedNamingStrategy.Instance.PropertyToColumnName(item.Name);
                    propertyMappers.TryAdd(columnName, item);
                }
                typePropertyCache[entityType] = propertyMappers;
                return propertyMappers;
            }
    
    
            public static IEnumerable<T> QueryList<T>(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null)
            {
                IDataReader reader = connection.ExecuteReader(sql, param, transaction, commandTimeout, commandType);
    
                List<T> list = new List<T>();
                var propertyMappers = GetTypePropertyMap(typeof(T));
                while (reader.Read())
                {
                    T obj = Activator.CreateInstance<T>();
    
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        if (reader.IsDBNull(i))
                        {
                            continue;
                        }
                        string columnName = reader.GetName(i).ToLower();
                        if (!propertyMappers.ContainsKey(columnName))
                        {
                            continue;
                        }
                        PropertyInfo property = propertyMappers[columnName];
                        if (property == null)
                        {
                            continue;
                        }
    
                        property.SetValue(obj, ChangeType(reader[columnName], property.PropertyType));
                    }
                    list.Add(obj);
                }
                return list;
            }
    
            static public object ChangeType(object value, Type type)
            {
                if (value == null && type.IsGenericType) return Activator.CreateInstance(type);
                if (value == null) return null;
                if (type == value.GetType()) return value;
                if (type.IsEnum)
                {
                    if (value is string)
                        return Enum.Parse(type, value as string);
                    else
                        return Enum.ToObject(type, value);
                }
                if (!type.IsInterface && type.IsGenericType)
                {
                    Type innerType = type.GetGenericArguments()[0];
                    object innerValue = ChangeType(value, innerType);
                    return Activator.CreateInstance(type, new object[] { innerValue });
                }
                if (value is string && type == typeof(Guid)) return new Guid(value as string);
                if (value is string && type == typeof(Version)) return new Version(value as string);
                if (!(value is IConvertible)) return value;
                return Convert.ChangeType(value, type);
            }
        }
  • 相关阅读:
    让Controller支持对平铺参数执行@Valid数据校验
    @Validated和@Valid的区别?校验级联属性(内部类)
    Apache和Spring提供的StopWatch执行时间监视器
    Spring方法级别数据校验:@Validated + MethodValidationPostProcessor
    疑问
    第20章 链接详解(笔记)
    nm命令介绍
    使用Euclid算法求最大公约数
    Linux Man手册的使用示例
    VMware12 + Ubuntu16.04 虚拟磁盘扩容
  • 原文地址:https://www.cnblogs.com/shya/p/9302280.html
Copyright © 2011-2022 走看看