Exemplo n.º 1
0
        public byte[] ConvertToBytes(object propertyValue, Type propertyType, bool?reverse = null)
        {
            switch (propertyValue)
            {
            case null:
                throw TcpException.PropertyArgumentIsNull(propertyType.ToString());

            case byte @byte:
                return(new[] { @byte });

            case byte[] byteArray:
                return(reverse.GetValueOrDefault() ? Reverse(byteArray) : byteArray);

            default:
                try
                {
                    if (_customConverters.TryConvert(propertyType, propertyValue, out var result))
                    {
                        return(reverse.GetValueOrDefault() ? Reverse(result) : result);
                    }

                    if (!_builtInConvertersToBytes.TryGetValue(propertyType, out var methodInfo))
                    {
                        throw TcpException.ConverterNotFoundType(propertyType.ToString());
                    }

                    result = (byte[])methodInfo.Invoke(null, new[] { propertyValue });
                    return(reverse ?? _options.PrimitiveValueReverse ? Reverse(result) : result);
                }
                catch (Exception exception) when(!(exception is TcpException))
                {
                    throw TcpException.ConverterUnknownError(propertyType.ToString(), exception.Message);
                }
            }
        }
Exemplo n.º 2
0
        public object ConvertFromBytes(ReadOnlySequence <byte> slice, Type propertyType, bool?reverse = null)
        {
            if (propertyType == typeof(byte[]))
            {
                return(reverse.GetValueOrDefault() ? Reverse(slice.ToArray()) : slice.ToArray());
            }

            if (propertyType == typeof(byte))
            {
                return(slice.FirstSpan[0]);
            }

            var(span, returnArray) = MergeSpans(slice, propertyType.IsPrimitive ? reverse ?? _options.PrimitiveValueReverse : reverse.GetValueOrDefault());

            try
            {
                if (_customConverters.TryConvertBack(propertyType, span, out var result))
                {
                    return(result);
                }

                return(propertyType.Name switch
                {
                    nameof(Boolean) => BitConverter.ToBoolean(span),
                    nameof(Char) => BitConverter.ToChar(span),
                    nameof(Double) => BitConverter.ToDouble(span),
                    nameof(Int16) => BitConverter.ToInt16(span),
                    nameof(Int32) => BitConverter.ToInt32(span),
                    nameof(Int64) => BitConverter.ToInt64(span),
                    nameof(Single) => BitConverter.ToSingle(span),
                    nameof(UInt16) => BitConverter.ToUInt16(span),
                    nameof(UInt32) => BitConverter.ToUInt32(span),
                    nameof(UInt64) => BitConverter.ToUInt64(span),
                    _ => throw TcpException.ConverterNotFoundType(propertyType.ToString())
                });
            }