예제 #1
0
        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);
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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.");
                });
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        public bool CanConvert(MemberInfo member, ParameterInfo paramInfo, IHttpRequest httpRequest, IApplication application, IProvideApiValue apiValueProvider, object objectValue)
        {
            var objectType = member.GetPropertyOrFieldType();

            return(CanConvert(objectType, httpRequest, application));
        }