예제 #1
0
            public JsonValue Serialize <T>(OpenApiSerializer serializer, T value)
            {
                var key = new SerializerKey(typeof(T).TypeHandle, value.GetType().TypeHandle);
                var del = _delegates.GetOrAdd(key, CreateSerializer <T>);

                return(((Func <OpenApiSerializer, T, JsonValue>)del)(serializer, value));
            }
예제 #2
0
            private Delegate CreateSerializer <T>(SerializerKey key)
            {
                var argType  = typeof(T);
                var instType = Type.GetTypeFromHandle(key.InstanceType);

                MethodInfo method = default;

                for (; instType != typeof(ValueType) && instType != typeof(object); instType = instType.BaseType)
                {
                    method = _methods.FirstOrDefault(x => x.GetParameters()[0].ParameterType == instType);
                    if (method != null)
                    {
                        break;
                    }
                }

                if (method == default)
                {
                    instType = Type.GetTypeFromHandle(key.InstanceType);
                    return(new Func <OpenApiSerializer, T, JsonValue>(
                               (x, y) => throw new NotSupportedException($"Serializing the type {instType.FullName} is not supported.")));
                }

                var serParam = Expression.Parameter(_serializerType, "serializer");
                var param    = Expression.Parameter(argType, "value");
                var conv     = argType == instType
                    ? (Expression)param
                    : Expression.Convert(param, instType);
                var call = Expression.Call(serParam, method, conv);

                return(Expression.Lambda <Func <OpenApiSerializer, T, JsonValue> >(call, serParam, param).Compile());
            }
        private static XmlSerializer GetSerializer(string rootNamespace, string elementName, Type elementType)
        {
            var serializerKey = new SerializerKey(rootNamespace, elementName, elementType);

            return(Serializers.GetOrAdd(serializerKey, _ =>
            {
                var rootAttribute = new XmlRootAttribute(elementName)
                {
                    Namespace = rootNamespace
                };
                return new XmlSerializer(elementType, rootAttribute);
            }));
        }
예제 #4
0
        /// <summary>
        /// 获取实体序列化器
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="record"></param>
        /// <returns></returns>
        public virtual Func <IDataRecord, T> GetSerializer <T>(IDataRecord record)
        {
            string[] names = new string[record.FieldCount];
            for (int i = 0; i < record.FieldCount; i++)
            {
                names[i] = record.GetName(i);
            }
            var key     = new SerializerKey(typeof(T), names.Length == 1 ? null : names);
            var handler = _serializers.GetOrAdd(key, k =>
            {
                return(CreateTypeSerializerHandler <T>(record));
            });

            return(handler as Func <IDataRecord, T>);
        }
예제 #5
0
        /// <summary>
        /// 获取实体序列化器
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="record"></param>
        /// <returns></returns>
        public virtual Func <IDataRecord, T> GetDataReaderToEntityHandler <T>(IDataRecord record)
        {
            var names = new StringBuilder();

            if (record.FieldCount > 1)
            {
                for (int i = 0; i < record.FieldCount; i++)
                {
                    names.Append(record.GetName(i));
                    if (i + 1 != record.FieldCount)
                    {
                        names.Append('.');
                    }
                }
            }
            var key     = new SerializerKey(typeof(T), names.ToString());
            var handler = _serializers.GetOrAdd(key, k =>
            {
                return(CreateEntityBindHandler <T>(record));
            });

            return(handler as Func <IDataRecord, T>);
        }
예제 #6
0
        /// <summary>
        /// IDataRecord Converted to T
        /// </summary>
        public static Func <IDataRecord, T> GetSerializer <T>(ITypeMapper mapper, IDataRecord record)
        {
            string[] names = new string[record.FieldCount];
            for (int i = 0; i < record.FieldCount; i++)
            {
                names[i] = record.GetName(i);
            }
            var key = new SerializerKey(typeof(T), names.Length == 1 ? names : names);

            _serializers.TryGetValue(key, out object handler);
            if (handler == null)
            {
                lock (_serializers)
                {
                    handler = CreateTypeSerializerHandler <T>(mapper, record);
                    if (!_serializers.ContainsKey(key))
                    {
                        _serializers.Add(key, handler);
                    }
                }
            }
            return(handler as Func <IDataRecord, T>);
        }