1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-07 16:06:15 +00:00
This commit is contained in:
Jkorf 2025-03-17 14:48:21 +01:00
parent a8907c7ea5
commit f17d9032fb
6 changed files with 30 additions and 33 deletions

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
@ -10,7 +11,12 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
/// <summary> /// <summary>
/// Converter for comma separated enum values /// Converter for comma separated enum values
/// </summary> /// </summary>
#if NET5_0_OR_GREATER
public class CommaSplitEnumConverter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T> : JsonConverter<T[]> where T : struct, Enum
#else
public class CommaSplitEnumConverter<T> : JsonConverter<T[]> where T : struct, Enum public class CommaSplitEnumConverter<T> : JsonConverter<T[]> where T : struct, Enum
#endif
{ {
/// <inheritdoc /> /// <inheritdoc />
public override T[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override T[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

View File

@ -21,7 +21,11 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
/// </summary> /// </summary>
/// <param name="value">String value</param> /// <param name="value">String value</param>
/// <returns></returns> /// <returns></returns>
#if NET5_0_OR_GREATER
public static T? ParseString<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T>(string value) where T : struct, Enum
#else
public static T? ParseString<T>(string value) where T : struct, Enum public static T? ParseString<T>(string value) where T : struct, Enum
#endif
=> EnumConverter<T>.ParseString(value); => EnumConverter<T>.ParseString(value);
/// <summary> /// <summary>
@ -61,27 +65,8 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
: JsonConverter<T>, INullableConverterFactory where T : struct, Enum : JsonConverter<T>, INullableConverterFactory where T : struct, Enum
{ {
private static List<KeyValuePair<T, string>>? _mapping = null; private static List<KeyValuePair<T, string>>? _mapping = null;
private bool _warnOnMissingEntry = true;
private bool _writeAsInt;
private NullableEnumConverter? _nullableEnumConverter = null; private NullableEnumConverter? _nullableEnumConverter = null;
///// <summary>
///// ctor
///// </summary>
//public EnumConverter() : this(false, true)
//{ }
///// <summary>
///// ctor
///// </summary>
///// <param name="writeAsInt"></param>
///// <param name="warnOnMissingEntry"></param>
//public EnumConverter(bool writeAsInt, bool warnOnMissingEntry)
//{
// _warnOnMissingEntry = warnOnMissingEntry;
// _writeAsInt = writeAsInt;
//}
internal class NullableEnumConverter : JsonConverter<T?> internal class NullableEnumConverter : JsonConverter<T?>
{ {
private readonly EnumConverter<T> _enumConverter; private readonly EnumConverter<T> _enumConverter;
@ -160,7 +145,6 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
else else
{ {
// We received an enum value but weren't able to parse it. // We received an enum value but weren't able to parse it.
if (_warnOnMissingEntry)
Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Cannot map enum value. EnumType: {enumType.Name}, Value: {stringValue}, Known values: {string.Join(", ", _mapping.Select(m => m.Value))}. If you think {stringValue} should added please open an issue on the Github repo"); Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Cannot map enum value. EnumType: {enumType.Name}, Value: {stringValue}, Known values: {string.Join(", ", _mapping.Select(m => m.Value))}. If you think {stringValue} should added please open an issue on the Github repo");
} }
@ -172,17 +156,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
/// <inheritdoc /> /// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
if (!_writeAsInt)
{ {
var stringValue = GetString(value); var stringValue = GetString(value);
writer.WriteStringValue(stringValue); writer.WriteStringValue(stringValue);
} }
else
{
writer.WriteNumberValue((int)Convert.ChangeType(value, typeof(int)));
}
}
private static bool GetValue(Type objectType, string value, out T? result) private static bool GetValue(Type objectType, string value, out T? result)
{ {

View File

@ -19,7 +19,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
if (string.IsNullOrEmpty(value)) if (string.IsNullOrEmpty(value))
return default; return default;
return (T?)JsonDocument.Parse(value!).Deserialize(typeof(T)); return (T?)JsonDocument.Parse(value!).Deserialize(typeof(T), options);
} }
/// <inheritdoc /> /// <inheritdoc />

View File

@ -167,6 +167,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
} }
/// <inheritdoc /> /// <inheritdoc />
#if NET5_0_OR_GREATER
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2026:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL3050:RequiresUnreferencedCode", Justification = "JsonSerializerOptions provided here has TypeInfoResolver set")]
#endif
public List<T?>? GetValues<T>(MessagePath path) public List<T?>? GetValues<T>(MessagePath path)
{ {
if (!IsJson) if (!IsJson)
@ -179,7 +183,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
if (value.Value.ValueKind != JsonValueKind.Array) if (value.Value.ValueKind != JsonValueKind.Array)
return default; return default;
return value.Value.Deserialize<List<T>>()!; return value.Value.Deserialize<List<T>>(_customSerializerOptions)!;
} }
private JsonElement? GetPathNode(MessagePath path) private JsonElement? GetPathNode(MessagePath path)

View File

@ -2,6 +2,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@ -97,7 +98,11 @@ namespace CryptoExchange.Net.SharedApis
/// Options for an exchange endpoint /// Options for an exchange endpoint
/// </summary> /// </summary>
/// <typeparam name="T">Type of data</typeparam> /// <typeparam name="T">Type of data</typeparam>
#if NET5_0_OR_GREATER
public class EndpointOptions<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T> : EndpointOptions where T : SharedRequest
#else
public class EndpointOptions<T> : EndpointOptions where T : SharedRequest public class EndpointOptions<T> : EndpointOptions where T : SharedRequest
#endif
{ {
/// <summary> /// <summary>
/// Required optional parameters in the request /// Required optional parameters in the request

View File

@ -1,4 +1,5 @@
using CryptoExchange.Net.Objects; using CryptoExchange.Net.Objects;
using System.Diagnostics.CodeAnalysis;
using System.Text; using System.Text;
namespace CryptoExchange.Net.SharedApis namespace CryptoExchange.Net.SharedApis
@ -7,7 +8,11 @@ namespace CryptoExchange.Net.SharedApis
/// Options for paginated endpoints /// Options for paginated endpoints
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T"></typeparam>
#if NET5_0_OR_GREATER
public class PaginatedEndpointOptions<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T> : EndpointOptions<T> where T : SharedRequest
#else
public class PaginatedEndpointOptions<T> : EndpointOptions<T> where T : SharedRequest public class PaginatedEndpointOptions<T> : EndpointOptions<T> where T : SharedRequest
#endif
{ {
/// <summary> /// <summary>
/// Type of pagination supported /// Type of pagination supported