diff --git a/CryptoExchange.Net/Converters/SystemTextJson/CommaSplitEnumConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/CommaSplitEnumConverter.cs index f99de56..6e17fee 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/CommaSplitEnumConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/CommaSplitEnumConverter.cs @@ -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 /// /// Converter for comma separated enum values /// - public class CommaSplitEnumConverter : JsonConverter where T: struct, Enum +#if NET5_0_OR_GREATER + public class CommaSplitEnumConverter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields)] T> : JsonConverter where T : struct, Enum +#else + public class CommaSplitEnumConverter : JsonConverter where T : struct, Enum +#endif + { /// public override T[]? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) diff --git a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs index bad0d4d..0971d4b 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs @@ -21,7 +21,11 @@ namespace CryptoExchange.Net.Converters.SystemTextJson /// /// String value /// +#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(string value) where T : struct, Enum +#endif => EnumConverter.ParseString(value); /// @@ -61,27 +65,8 @@ namespace CryptoExchange.Net.Converters.SystemTextJson : JsonConverter, INullableConverterFactory where T : struct, Enum { private static List>? _mapping = null; - private bool _warnOnMissingEntry = true; - private bool _writeAsInt; private NullableEnumConverter? _nullableEnumConverter = null; - ///// - ///// ctor - ///// - //public EnumConverter() : this(false, true) - //{ } - - ///// - ///// ctor - ///// - ///// - ///// - //public EnumConverter(bool writeAsInt, bool warnOnMissingEntry) - //{ - // _warnOnMissingEntry = warnOnMissingEntry; - // _writeAsInt = writeAsInt; - //} - internal class NullableEnumConverter : JsonConverter { private readonly EnumConverter _enumConverter; @@ -160,8 +145,7 @@ 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"); + 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"); } return null; @@ -173,15 +157,8 @@ namespace CryptoExchange.Net.Converters.SystemTextJson /// 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))); - } + var stringValue = GetString(value); + writer.WriteStringValue(stringValue); } private static bool GetValue(Type objectType, string value, out T? result) diff --git a/CryptoExchange.Net/Converters/SystemTextJson/ObjectStringConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/ObjectStringConverter.cs index d35bd98..b9b73a8 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/ObjectStringConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/ObjectStringConverter.cs @@ -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); } /// diff --git a/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs b/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs index b0d45a9..5d6576d 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/SystemTextJsonMessageAccessor.cs @@ -167,6 +167,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson } /// +#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? GetValues(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>()!; + return value.Value.Deserialize>(_customSerializerOptions)!; } private JsonElement? GetPathNode(MessagePath path) diff --git a/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/EndpointOptions.cs b/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/EndpointOptions.cs index 996b2ec..3bc4b4b 100644 --- a/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/EndpointOptions.cs +++ b/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/EndpointOptions.cs @@ -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 /// /// Type of data +#if NET5_0_OR_GREATER + public class EndpointOptions<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T> : EndpointOptions where T : SharedRequest +#else public class EndpointOptions : EndpointOptions where T : SharedRequest +#endif { /// /// Required optional parameters in the request diff --git a/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PaginatedEndpointOptions.cs b/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PaginatedEndpointOptions.cs index 572a9ef..10e98bb 100644 --- a/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PaginatedEndpointOptions.cs +++ b/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PaginatedEndpointOptions.cs @@ -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 /// /// +#if NET5_0_OR_GREATER + public class PaginatedEndpointOptions<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T> : EndpointOptions where T : SharedRequest +#else public class PaginatedEndpointOptions : EndpointOptions where T : SharedRequest +#endif { /// /// Type of pagination supported