From 185dfeb6fbc4b95f367618bd83fe608f0ced823d Mon Sep 17 00:00:00 2001 From: JKorf Date: Sun, 28 Jul 2024 22:39:38 +0200 Subject: [PATCH] Added ParseString to EnumConverter for manual calling --- .../SystemTextJsonConverterTests.cs | 14 ++++++++ .../SystemTextJson/EnumConverter.cs | 32 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/CryptoExchange.Net.UnitTests/SystemTextJsonConverterTests.cs b/CryptoExchange.Net.UnitTests/SystemTextJsonConverterTests.cs index c328126..ee8c3bb 100644 --- a/CryptoExchange.Net.UnitTests/SystemTextJsonConverterTests.cs +++ b/CryptoExchange.Net.UnitTests/SystemTextJsonConverterTests.cs @@ -163,6 +163,20 @@ namespace CryptoExchange.Net.UnitTests Assert.That(output.Value == expected); } + [TestCase("1", TestEnum.One)] + [TestCase("2", TestEnum.Two)] + [TestCase("3", TestEnum.Three)] + [TestCase("three", TestEnum.Three)] + [TestCase("Four", TestEnum.Four)] + [TestCase("four", TestEnum.Four)] + [TestCase("Four1", TestEnum.One)] + [TestCase(null, TestEnum.One)] + public void TestEnumConverterParseStringTests(string value, TestEnum? expected) + { + var result = EnumConverter.ParseString(value); + Assert.That(result == expected); + } + [TestCase("1", true)] [TestCase("true", true)] [TestCase("yes", true)] diff --git a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs index 04732e2..e4a3df4 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs @@ -211,5 +211,37 @@ namespace CryptoExchange.Net.Converters.SystemTextJson return enumValue == null ? null : (mapping.FirstOrDefault(v => v.Key.Equals(enumValue)).Value ?? enumValue.ToString()); } + + /// + /// Get the enum value from a string + /// + /// Enum type + /// String value + /// + public static T? ParseString(string value) where T : Enum + { + var type = typeof(T); + if (!_mapping.TryGetValue(type, out var enumMapping)) + enumMapping = AddMapping(type); + + var mapping = enumMapping.FirstOrDefault(kv => kv.Value.Equals(value, StringComparison.InvariantCulture)); + if (mapping.Equals(default(KeyValuePair))) + mapping = enumMapping.FirstOrDefault(kv => kv.Value.Equals(value, StringComparison.InvariantCultureIgnoreCase)); + + if (!mapping.Equals(default(KeyValuePair))) + { + return (T)mapping.Key; + } + + try + { + // If no explicit mapping is found try to parse string + return (T)Enum.Parse(type, value, true); + } + catch (Exception) + { + return default; + } + } } }