C# How to create a custom odata serializer / converter in .NET5/.NET Core? Enum flags to array

Viewed 112

I tried to add services.AddSingleton<ODataPayloadValueConverter, EnumFlagODataPayloadValueConverter>();

Microsoft.AspNetCore.OData 8.02 is being used.

I want to convert enum flags to to an array instead. ElementalFlagType is for testing purpose.

    internal class EnumFlagODataPayloadValueConverter : ODataPayloadValueConverter
    {
        public override object ConvertToPayloadValue(object value, IEdmTypeReference edmTypeReference)
        {
            if (value is ElementalFlagType flag)
            {
                var ret = new List<ElementalFlagType>(11);
                foreach (var enumValue in Enum.GetValues<ElementalFlagType>())
                {
                    if (flag.HasFlag(enumValue))
                    {
                        ret.Add(enumValue);
                    }
                }

                return ret.ToArray();
            }

            return base.ConvertToPayloadValue(value, edmTypeReference);
        }

        public override object ConvertFromPayloadValue(object value, IEdmTypeReference edmTypeReference)
        {
            if (edmTypeReference.IsEnum() && value is ElementalFlagType[] flags)
            {
                ElementalFlagType ret = ElementalFlagType.None;
                foreach (var flag in flags)
                {
                    EnumFlag.Set(ref ret, flag);
                }

                return ret;
            }

            return base.ConvertFromPayloadValue(value, edmTypeReference);
        }
    }

The code is not executed at all.

I also tried something like this but I am not sure how to register it, I tried to add it as well to the service collection. Do I need to clear the default one? ODataSerializerProvider

    public class CustomODataSerializerProvider : ODataSerializerProvider
    {
        private readonly EnumFlagODataEntityTypeSerializer _entityTypeSerializer;

        public CustomODataSerializerProvider(IServiceProvider rootContainer)
            : base(rootContainer)
        {
            _entityTypeSerializer = new EnumFlagODataEntityTypeSerializer(this);
        }

        public override IODataEdmTypeSerializer GetEdmTypeSerializer(IEdmTypeReference edmType)
        {
            if (edmType.Definition.TypeKind == EdmTypeKind.Enum)
            {
                return _entityTypeSerializer;
            }

            return base.GetEdmTypeSerializer(edmType);
        }
    }
0 Answers
Related