public Task WriteAsync(JsonWriter writer, JsonSerializer serializer, MemberInfo member, ParameterInfo paramInfo, IProvideApiValue apiValueProvider, object objectValue, object memberValue, IHttpRequest httpRequest, IApplication application) { var linkType = member.GetPropertyOrFieldType(); Task result = (Task)typeof(LinkAttribute) .GetMethod(nameof(WriteGenericAsync), BindingFlags.Static | BindingFlags.Public) .MakeGenericMethod(linkType.GenericTypeArguments) .Invoke(null, new object[] { writer, objectValue, memberValue, httpRequest }); return(result); }
public bool CanConvert(MemberInfo member, ParameterInfo paramInfo, IHttpRequest httpRequest, IApplication application, IProvideApiValue apiValueProvider, object objectValue) { var type = member.GetPropertyOrFieldType(); return(CanConvert(type)); bool CanConvert(Type type) { if (typeof(string).IsAssignableFrom(type)) { return(true); } if (type.IsNumeric()) { return(true); } if (type.IsEnum) { return(true); } if (typeof(bool).IsAssignableFrom(type)) { return(true); } if (typeof(DateTime).IsAssignableFrom(type)) { return(true); } if (typeof(TimeSpan).IsAssignableFrom(type)) { return(true); } return(type.IsNullable( baseType => CanConvert(baseType), () => false)); } }
public bool CanConvert(MemberInfo member, ParameterInfo paramInfo, IHttpRequest httpRequest, IApplication application, IProvideApiValue apiValueProvider, object objectValue) { var type = member.GetPropertyOrFieldType(); var isLink = type.IsSubClassOfGeneric(typeof(LinkFromRequest <>)); return(isLink); }
public async Task WriteAsync(JsonWriter writer, JsonSerializer serializer, MemberInfo member, ParameterInfo paramInfo, IProvideApiValue apiValueProvider, object objectValue, object memberValue, IHttpRequest httpRequest, IApplication application) { var type = member.GetPropertyOrFieldType(); await WriteForTypeAsync(type, memberValue); async Task WriteForTypeAsync(Type type, object memberValue) { if (memberValue == null) { await writer.WriteNullAsync(); return; } if (typeof(string).IsAssignableFrom(type)) { await writer.WriteValueAsync((string)memberValue); return; } if (typeof(bool).IsAssignableFrom(type)) { await writer.WriteValueAsync((bool)memberValue); return; } if (type.IsNumeric()) { await writer.WriteValueAsync(memberValue); return; } if (type.IsEnum) { var enumString = Enum.GetName(type, memberValue); await writer.WriteValueAsync(enumString); return; } if (typeof(DateTime).IsAssignableFrom(type)) { await writer.WriteValueAsync((DateTime)memberValue); return; } if (typeof(TimeSpan).IsAssignableFrom(type)) { var tsValue = (TimeSpan)memberValue; var writeableValue = tsValue.ToString(); await writer.WriteValueAsync(writeableValue); return; } bool written = await type.IsNullable( async baseType => { var baseValue = memberValue.GetNullableValue(); await WriteForTypeAsync(baseType, baseValue); return(true); }, () => { throw new ArgumentException($"{nameof(CastJsonBasicTypesAttribute)}..{nameof(CastJsonBasicTypesAttribute.CanConvert)} said yes but the truth is no."); }); } }
public async Task WriteAsync(JsonWriter writer, JsonSerializer serializer, MemberInfo member, ParameterInfo paramInfo, IProvideApiValue apiValueProvider, object objectValue, object memberValue, IHttpRequest httpRequest, IApplication application) { var converters = application.GetType() .GetAttributesInterface <IConvertJson>() .Where(jc => jc.CanConvert(memberValue.GetType(), httpRequest, application)); if (converters.Any()) { converters.First().Write(writer, memberValue, serializer, httpRequest, application); return; } async Task WriteIdAsync(Guid?idMaybe) { if (!idMaybe.HasValue) { await writer.WriteValueAsync((string)null); return; } var id = idMaybe.Value; await writer.WriteValueAsync(id); } if (memberValue is IReferenceable) { var id = (memberValue as IReferenceable).id; await WriteIdAsync(id); //writer.WriteValue(id); return; } if (memberValue is IReferences) { writer.WriteStartArray(); Guid[] ids = await(memberValue as IReferences).ids .Select( async id => { await WriteIdAsync(id); //writer.WriteValue(id); return(id); }) .AsyncEnumerable() .ToArrayAsync(); await writer.WriteEndArrayAsync(); return; } if (memberValue is IReferenceableOptional) { var id = (memberValue as IReferenceableOptional).id; await WriteIdAsync(id); return; } if (!memberValue.TryGetType(out Type valueType)) { await writer.WriteNullAsync(); return; } if (valueType.IsSubClassOfGeneric(typeof(IDictionary <,>))) { await writer.WriteStartObjectAsync(); foreach (var kvpObj in memberValue.DictionaryKeyValuePairs()) { var keyValue = kvpObj.Key; var propertyName = (keyValue is IReferenceable) ? (keyValue as IReferenceable).id.ToString() : keyValue.ToString(); writer.WritePropertyName(propertyName); var valueValue = kvpObj.Value; var valueValueType = valueType.GenericTypeArguments.Last(); if (this.ShouldConvertDictionaryType(valueValueType, httpRequest, application)) { await WriteAsync(writer, serializer, member, paramInfo, apiValueProvider, objectValue, valueValue, httpRequest, application); continue; } await writer.WriteValueAsync(valueValue); } await writer.WriteEndObjectAsync(); return; } if (memberValue is Type) { var typeValue = (memberValue as Type); var serializationAttrs = typeValue .GetAttributesInterface <IProvideSerialization>(); if (serializationAttrs.Any()) { var serializationAttr = serializationAttrs .OrderByDescending(x => x.GetPreference(httpRequest)) .First(); writer.WriteValue(serializationAttr.ContentType); return; } var stringType = typeValue.GetClrString(); writer.WriteValue(stringType); return; } if (valueType.IsEnum) { var stringValue = Enum.GetName(valueType, memberValue); writer.WriteValue(stringValue); return; } serializer.Serialize(writer, memberValue); }
public bool CanConvert(MemberInfo member, ParameterInfo paramInfo, IHttpRequest httpRequest, IApplication application, IProvideApiValue apiValueProvider, object objectValue) { var objectType = member.GetPropertyOrFieldType(); return(CanConvert(objectType, httpRequest, application)); }