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.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Text.Json;
@ -10,7 +11,12 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
/// <summary>
/// Converter for comma separated enum values
/// </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
#endif
{
/// <inheritdoc />
public override T[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

View File

@ -21,7 +21,11 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
/// </summary>
/// <param name="value">String value</param>
/// <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
#endif
=> EnumConverter<T>.ParseString(value);
/// <summary>
@ -61,27 +65,8 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
: JsonConverter<T>, INullableConverterFactory where T : struct, Enum
{
private static List<KeyValuePair<T, string>>? _mapping = null;
private bool _warnOnMissingEntry = true;
private bool _writeAsInt;
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?>
{
private readonly EnumConverter<T> _enumConverter;
@ -160,7 +145,6 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
else
{
// 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");
}
@ -172,17 +156,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
if (!_writeAsInt)
{
var stringValue = GetString(value);
writer.WriteStringValue(stringValue);
}
else
{
writer.WriteNumberValue((int)Convert.ChangeType(value, typeof(int)));
}
}
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))
return default;
return (T?)JsonDocument.Parse(value!).Deserialize(typeof(T));
return (T?)JsonDocument.Parse(value!).Deserialize(typeof(T), options);
}
/// <inheritdoc />

View File

@ -167,6 +167,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
}
/// <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)
{
if (!IsJson)
@ -179,7 +183,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson
if (value.Value.ValueKind != JsonValueKind.Array)
return default;
return value.Value.Deserialize<List<T>>()!;
return value.Value.Deserialize<List<T>>(_customSerializerOptions)!;
}
private JsonElement? GetPathNode(MessagePath path)

View File

@ -2,6 +2,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
@ -97,7 +98,11 @@ namespace CryptoExchange.Net.SharedApis
/// Options for an exchange endpoint
/// </summary>
/// <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
#endif
{
/// <summary>
/// Required optional parameters in the request

View File

@ -1,4 +1,5 @@
using CryptoExchange.Net.Objects;
using System.Diagnostics.CodeAnalysis;
using System.Text;
namespace CryptoExchange.Net.SharedApis
@ -7,7 +8,11 @@ namespace CryptoExchange.Net.SharedApis
/// Options for paginated endpoints
/// </summary>
/// <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
#endif
{
/// <summary>
/// Type of pagination supported