В случае, если кому-то интересно: мне нужно было сделать то же самое для создания Bindable enumconverter для WPF.Поскольку я не знаю, что означают значения в Reflection, мне нужно было вручную переключать значения (связывая их с флажком pe).Существует проблема установки значения перечисляемого перечисления на -1, чтобы установить все биты.Если вы установите его равным -1, и все значения будут отменены, это не приведет к 0, поскольку все неиспользуемые биты не будут помечены.Это Ват работал лучше всего для моей ситуации.
SomeRightEnum someRightEnum = SomeRightEnum.CanDoNothing;
Type enumType = someRightEnum.GetType();
int newValue = 0;
var enumValues = Enum.GetValues(enumType).Cast<int>().Where(e => e == 1 || e % 2 == 0);
foreach (var value in enumValues)
{
newValue |= value;
}
Console.WriteLine(newValue);
Или, если вы хотите метод расширения:
public static class FlagExtensions
{
public static TEnum AllFlags<TEnum>(this TEnum @enum)
where TEnum : struct
{
Type enumType = typeof(TEnum);
long newValue = 0;
var enumValues = Enum.GetValues(enumType);
foreach (var value in enumValues)
{
long v = (long)Convert.ChangeType(value, TypeCode.Int64);
if(v == 1 || v % 2 == 0)
{
newValue |= v;
}
}
return (TEnum)Enum.ToObject(enumType , newValue);
}
}