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)); }
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); })); }
/// <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>); }
/// <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>); }
/// <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>); }