Нет, вы не можете сделать это с помощью C# generics. Тем не менее, вы могли сделать:
public static bool IsEnumFlagPresent<T>(T value, T lookingForFlag)
where T : struct
{
int intValue = (int) (object) value;
int intLookingForFlag = (int) (object) lookingForFlag;
return ((intValue & intLookingForFlag) == intLookingForFlag);
}
Это будет работать только для перечислений, которые имеют базовый тип int
, и это несколько неэффективно, потому что это коробки значение ... но он должен работать.
Вы можете добавить проверку типа исполнения, что T является фактически типом перечисления (например typeof(T).BaseType == typeof(Enum)
)
Вот полная программа демонстрирует это работает:
using System;
[Flags]
enum Foo
{
A = 1,
B = 2,
C = 4,
D = 8
}
class Test
{
public static Boolean IsEnumFlagPresent<T>(T value, T lookingForFlag)
where T : struct
{
int intValue = (int) (object) value;
int intLookingForFlag = (int) (object) lookingForFlag;
return ((intValue & intLookingForFlag) == intLookingForFlag);
}
static void Main()
{
Console.WriteLine(IsEnumFlagPresent(Foo.B | Foo.C, Foo.A));
Console.WriteLine(IsEnumFlagPresent(Foo.B | Foo.C, Foo.B));
Console.WriteLine(IsEnumFlagPresent(Foo.B | Foo.C, Foo.C));
Console.WriteLine(IsEnumFlagPresent(Foo.B | Foo.C, Foo.D));
}
}
Только примечание: В C# 4 структура Enum обеспечивает стандартный метод HasFlag(). –