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