// 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;
}
}
}