Стоит отметить, что простое предоставление статических перегрузок для всех целочисленных типов будет работать до тех пор, пока вы знаете, что работаете с конкретным перечислением. Они не будут работать, если код потребления также работает на where t : struct
Если вам нужно иметь дело с произвольной (структурой) T
В настоящее время вы не можете сделать быстрое преобразование типизированной структуры общего назначения в некоторую альтернативную побитовую форму (то есть, грубо говоря, reinterpret_cast) без использования C ++ / CLI
generic <typename T>
where T : value class
public ref struct Reinterpret
{
private:
const static int size = sizeof(T);
public:
static int AsInt(T t)
{
return *((Int32*) (void*) (&t));
}
}
Это позволит вам написать:
static void IsSet<T>(T value, T flags) where T : struct
{
if (!typeof(T).IsEnum)
throw new InvalidOperationException(typeof(T).Name +" is not an enum!");
Type t = Enum.GetUnderlyingType(typeof(T));
if (t == typeof(int))
{
return (Reinterpret.AsInt(value) & Reinterpret.AsInt(flags)) != 0
}
else if (t == typeof(byte))
{
return (Reinterpret.AsByte(value) & Reinterpret.AsByte(flags)) != 0
}
// you get the idea...
}
Вы не можете ограничиваться перечислениями. Но математическая валидность этих методов не изменится, если они используются с типами, не относящимися к enum, поэтому вы можете разрешить их, если сможете определить, что они могут быть преобразованы в структуру соответствующего размера.