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);
            }
        }
  • 相关阅读:
    localdatetime获取本月第一天及最后一天
    java线程池ThreadPoolExecutor类使用详解
    yapiideaupload
    select count(*)和select count(1)的区别
    pgsql upsert语法
    easyui的datagrid里getSelections只能获取一行值???
    vue.js 外部配置文件(参考)
    PostgreSQL ROW_NUMBER() OVER()
    echart
    vue拼接html中onclick的触发方式,vue中的onclick,vue触发onclick,vue拼接html
  • 原文地址:https://www.cnblogs.com/shya/p/9302280.html
Copyright © 2011-2022 走看看