Example #1
0
        public static Func <IDataRecord, object> CreateMap(DataReaderCache cache)
        {
            if (cache == null)
            {
                throw new ArgumentNullException(nameof(cache));
            }

            if (!_maps.TryGetValue(cache.GetColumnHash(), out Func <IDataRecord, object> func))
            {
                lock (_lock)
                {
                    if (!_maps.TryGetValue(cache.GetColumnHash(), out func))
                    {
                        func = Create(cache);
                        _maps.Add(cache.GetColumnHash(), func);
                    }
                }
            }

            return(func);
        }
Example #2
0
        public static Type Get(DataReaderCache cache)
        {
            if (cache == null)
            {
                throw new ArgumentNullException(nameof(cache));
            }

            if (!_cache.TryGetValue(cache.GetColumnHash(), out Type value))
            {
                lock (_lock)
                {
                    if (!_cache.TryGetValue(cache.GetColumnHash(), out value))
                    {
                        value = Create(cache);
                        _cache.Add(cache.GetColumnHash(), value);
                    }
                }
            }

            return(value);
        }
Example #3
0
        public static Func <IDataRecord, T> Create(DataReaderCache cache)
        {
            if (cache == null)
            {
                throw new ArgumentNullException(nameof(cache));
            }

            if (!_cache.TryGetValue(cache.GetColumnHash(), out Func <IDataRecord, T> func))
            {
                lock (_lock)
                {
                    if (!_cache.TryGetValue(cache.GetColumnHash(), out func))
                    {
                        func = CreateHelper(cache.Reader);
                        _cache.Add(cache.GetColumnHash(), func);
                    }
                }
            }

            return(func);
        }
Example #4
0
        private static Type Create(DataReaderCache cache)
        {
            TypeBuilder tb = _mb.DefineType(
                $"DynamicType_#{cache.GetColumnHash()}",
                TypeAttributes.Public);

            for (int fieldIndex = 0; fieldIndex < cache.Reader.FieldCount; fieldIndex++)
            {
                tb.DefineField(
                    cache.Reader.GetName(fieldIndex),
                    cache.Reader.GetFieldType(fieldIndex),
                    FieldAttributes.Public);
            }

            return(tb.CreateTypeInfo());
        }