internal static Func <DbDataReader, object> GetReader(int hashKey, Type targetType, DbDataReader reader, bool isIgnoreCase)
 {
     hashKey = RepositoryHelper.GetReaderKey(targetType, hashKey);
     if (!readerCache.ContainsKey(hashKey))
     {
         string       propName     = null;
         PropertyInfo propInfo     = null;
         var          bindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
         if (isIgnoreCase)
         {
             bindingFlags |= BindingFlags.IgnoreCase;
         }
         List <string> propNameList = new List <string>();
         for (int i = 0; i < reader.FieldCount; i++)
         {
             propName = reader.GetName(i);
             propInfo = targetType.GetProperty(propName, bindingFlags);
             if (propInfo == null)
             {
                 continue;
             }
             propNameList.Add(propInfo.Name);
         }
         var readerHandler = DbTypeMap.ContainsKey(targetType) ? CreateValueReaderHandler(targetType, reader.GetOrdinal(propName)) : CreateTypeReaderHandler(targetType, propNameList, reader);
         readerCache.TryAdd(hashKey, readerHandler);
     }
     return(readerCache[hashKey]);
 }