Skip to content

Instantly share code, notes, and snippets.

@pedrovasconcellos
Last active June 7, 2023 17:38
Show Gist options
  • Save pedrovasconcellos/d5d431db67224c6d5e79a0a255ec41d7 to your computer and use it in GitHub Desktop.
Save pedrovasconcellos/d5d431db67224c6d5e79a0a255ec41d7 to your computer and use it in GitHub Desktop.
InvalidToDefaultEnumConverter
public static class EnumExtensions
{
public static T? GetDefaultValue<T>() where T : Enum
{
var enumType = typeof(T);
var defaultValueAttribute = Attribute
.GetCustomAttribute(enumType, typeof(DefaultValueAttribute)) as DefaultValueAttribute;
if (defaultValueAttribute is not null &&
defaultValueAttribute.Value is T)
{
return (T)defaultValueAttribute.Value;
}
return default;
}
}
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public class InvalidToDefaultEnumConverter<T> : JsonConverter<T> where T : struct, Enum
{
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
object valueSelected = reader.TokenType == JsonTokenType.Number
? reader.GetInt32() : reader.GetString();
if (Enum.TryParse(typeToConvert, valueSelected.ToString(), true, out object? result))
{
if(result is null)
return EnumExtensions.GetDefaultValue<T>();
return (T)result;
}
return EnumExtensions.GetDefaultValue<T>();
}
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new InvalidToDefaultEnumConverter<EnumT>());
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment