示例#1
0
        Value HandleValue()
        {
            switch (reader.TokenType)
            {
            case JsonToken.StartObject:
                return(ReadObject());

            case JsonToken.StartArray:
                return(ReadArray());

            case JsonToken.Integer:
                return(LongV.Of((long)reader.Value));

            case JsonToken.Float:
                return(DoubleV.Of((double)reader.Value));

            case JsonToken.String:
                return(StringV.Of((string)reader.Value));

            case JsonToken.Boolean:
                return(BooleanV.Of((bool)reader.Value));

            case JsonToken.Null:
                return(NullV.Instance);

            default:
                return(Unexpected());
            }
        }
示例#2
0
        Value EncodeIntern(object obj)
        {
            var type = obj.GetType();

            switch (Type.GetTypeCode(type))
            {
            case TypeCode.String:
                return(StringV.Of((string)obj));

            case TypeCode.Boolean:
                return(BooleanV.Of((bool)obj));

            case TypeCode.DateTime:
                return(WrapDateTime((DateTime)obj));

            case TypeCode.SByte:
            case TypeCode.Int16:
            case TypeCode.Int32:
            case TypeCode.Int64:
                return(LongV.Of(Convert.ToInt64(obj)));

            case TypeCode.Char:
            case TypeCode.Byte:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
                return(LongV.Of(Convert.ToInt64(obj)));

            case TypeCode.Single:
            case TypeCode.Double:
            case TypeCode.Decimal:
                return(DoubleV.Of(Convert.ToDouble(obj)));

            case TypeCode.DBNull:
            case TypeCode.Empty:
                return(NullV.Instance);

            case TypeCode.Object:
                if (typeof(byte[]).IsInstanceOfType(obj))
                {
                    return(new BytesV((byte[])obj));
                }

                if (typeof(IDictionary).IsInstanceOfType(obj))
                {
                    return(WrapDictionary((IDictionary)obj));
                }

                if (typeof(IEnumerable).IsInstanceOfType(obj))
                {
                    return(WrapEnumerable((IEnumerable)obj));
                }

                return(WrapObj(obj));
            }

            throw new InvalidOperationException($"Unsupported type {type} at `{obj}`");
        }
示例#3
0
        SwitchCase CreateSwitchCase(Enum enumValue)
        {
            var dstType   = enumValue.GetType();
            var enumName  = Enum.GetName(dstType, enumValue);
            var member    = dstType.GetMember(enumName)[0];
            var faunaEnum = member.GetCustomAttribute <FaunaEnum>();

            var body = Expression.Constant(
                StringV.Of(faunaEnum != null ? faunaEnum.Alias : enumName),
                typeof(Value)
                );

            return(Expression.SwitchCase(body, Expression.Constant(enumValue)));
        }
示例#4
0
        Value EncodeIntern(object obj, Type forceType)
        {
            var type = obj.GetType();

            if (forceType == typeof(StringV))
            {
                return(StringV.Of(obj.ToString()));
            }

            if (dbNullValue.Equals(obj))
            {
                return(NullV.Instance);
            }

            if (type.GetTypeInfo().IsEnum)
            {
                return(WrapEnum(obj, type));
            }

            switch (Type.GetTypeCode(type))
            {
            case TypeCode.String:
                return(StringV.Of((string)obj));

            case TypeCode.Boolean:
                return(BooleanV.Of((bool)obj));

            case TypeCode.DateTime:
                return(Value.FromDateTime((DateTime)obj, forceType));

            case TypeCode.SByte:
            case TypeCode.Int16:
            case TypeCode.Int32:
            case TypeCode.Int64:
                return(LongV.Of(Convert.ToInt64(obj)));

            case TypeCode.Char:
            case TypeCode.Byte:
            case TypeCode.UInt16:
            case TypeCode.UInt32:
            case TypeCode.UInt64:
                return(LongV.Of(Convert.ToInt64(obj)));

            case TypeCode.Single:
            case TypeCode.Double:
            case TypeCode.Decimal:
                return(DoubleV.Of(Convert.ToDouble(obj)));

#if !(NETSTANDARD1_5)
            case TypeCode.DBNull:
                return(NullV.Instance);
#endif

            case TypeCode.Empty:
                return(NullV.Instance);

            case TypeCode.Object:
                if (typeof(DateTimeOffset).IsInstanceOfType(obj))
                {
                    return(Value.FromDateTimeOffset((DateTimeOffset)obj, forceType));
                }

                if (typeof(byte[]).IsInstanceOfType(obj))
                {
                    return(new BytesV((byte[])obj));
                }

                if (typeof(IDictionary).IsInstanceOfType(obj))
                {
                    return(WrapDictionary((IDictionary)obj));
                }

                if (typeof(IEnumerable).IsInstanceOfType(obj))
                {
                    return(WrapEnumerable((IEnumerable)obj));
                }

                return(WrapObj(obj));
            }

            throw new InvalidOperationException($"Unsupported type {type} at `{obj}`");
        }