// Copyright © 2021 The CefSharp Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. using System; using System.Linq; using System.Reflection; using System.Text.Json; using System.Text.Json.Serialization; namespace CefSharp.Internals.Json { /// /// DevTools Json Enum Converter Factory /// public class JsonEnumConverterFactory : JsonConverterFactory { /// public override bool CanConvert(Type typeToConvert) { if(typeToConvert.IsEnum) { return true; } var nullType = Nullable.GetUnderlyingType(typeToConvert); return nullType?.IsEnum ?? false; } /// public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options) { var converter = (JsonConverter)Activator.CreateInstance( typeof(JsonEnumConverter<>).MakeGenericType(typeToConvert), BindingFlags.Instance | BindingFlags.Public, binder: null, args: null, culture: null); return converter; } public static object ConvertStringToEnum(string val, Type typeToConvert) { foreach (var name in Enum.GetNames(typeToConvert)) { var attribute = typeToConvert.GetField(name) .GetCustomAttributes(false) .OfType() .Single(); if (attribute.Name == val) { return Enum.Parse(typeToConvert, name); } } throw new JsonException("Unable to convert Enum"); } public static string ConvertEnumToString(object value) { var type = value.GetType(); var name = Enum.GetName(type, value); var attribute = type.GetField(name) .GetCustomAttributes(false) .OfType() .Single(); return attribute.Name; } } }