You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
In our project we use enums that are inheriting from byte, but the FlagsEnumModelBinder and FlagsEnumModelBinderProvider only handle the case where the enum is of type int.
I've managed to get it to work as intended by checking the underlying enum type and then returning a model binder that matches that type.
FlagsEnumModelBinderProvider
public IModelBinder GetBinder([NotNull] ModelBinderProviderContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (IsNotFlagsEnum(context))
{
return null;
}
var enumType
= Enum.GetUnderlyingType(context.Metadata.UnderlyingOrModelType);
if (enumType == typeof(int))
{
return new FlagsEnumIntModelBinder();
}
if (enumType == typeof(byte))
{
return new FlagsEnumByteModelBinder();
}
if (enumType == typeof(short))
{
return new FlagsEnumShortModelBinder();
}
if (enumType == typeof(long))
{
return new FlagsEnumLongModelBinder();
}
throw new InvalidOperationException(
$"enums inheriting of type '{enumType.FullName}' are not supporeted.");
}
And then in each ModelBinder on the aggregate I change the cast to the expected type. byte var result = actualValues.Aggregate(0, (current, value) => (byte)(current | (byte)value)); short var result = actualValues.Aggregate(0, (current, value) => (short)((short)current | (short)value)); long var result = actualValues.Aggregate((long)0, (current, value) => (current | (long)value));
The text was updated successfully, but these errors were encountered:
from: var result = actualValues.Aggregate(0, (current, value) => current | (int)value);
to: var result = actualValues.Aggregate(0UL, (current, value) => current | Convert.ToUInt64(value));
In our project we use enums that are inheriting from
byte
, but theFlagsEnumModelBinder
andFlagsEnumModelBinderProvider
only handle the case where the enum is of type int.I've managed to get it to work as intended by checking the underlying enum type and then returning a model binder that matches that type.
FlagsEnumModelBinderProvider
And then in each ModelBinder on the aggregate I change the cast to the expected type.
byte
var result = actualValues.Aggregate(0, (current, value) => (byte)(current | (byte)value));
short
var result = actualValues.Aggregate(0, (current, value) => (short)((short)current | (short)value));
long
var result = actualValues.Aggregate((long)0, (current, value) => (current | (long)value));
The text was updated successfully, but these errors were encountered: