Я хочу реализовать следующий метод с использованием .NET Standard:
public static void SetFlag<TEnum>(ref TEnum value, TEnum flag)
where TEnum : Enum
Я потратил часы, пытаясь добиться этого:
- Получение оператора
|
через отражение представляется невозможным для примитивных типов, так как enum
s. - Использование
dynamic
требует ссылки на дополнительный пакет (Microsoft.CSharp.RuntimeBinder
), но я быкак моя библиотека, чтобы поддерживать чистоту .NET Standard.
Моей последней идеей было вручную сравнить TEnum
с каждым допустимым типом перечисления {byte
, sbyte
, short
, ushort
, int
, uint
, long
, ulong
} .Но это кажется странным и грязным:
try
{
var v = (byte)(object)value | (byte)(object)flag;
value = (TEnum)(object)v;
return;
}
catch (InvalidCastException) { }
try
{
var v = (int)(object)value | (int)(object)flag;
value = (TEnum)(object)v;
return;
}
catch (InvalidCastException) { }
// ...
throw new NotSupportException($"Unknown enum type {typeof(TEnum)}");
Так это действительно единственный вариант .NET (Standard), предлагаемый здесь, или что мне не хватает?Ждем ваших подсказок!
Редактировать: Не дубликат этот вопрос ;Я использую C # 7.3 и общее ограничение Enum
.