No, no puede hacer esto con C# generics. Sin embargo, usted podría hacer:
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);
}
Esto sólo funcionará para las enumeraciones que tienen un tipo subyacente de int
, y es algo ineficaz, ya que el valor de las cajas ... pero debería funcionar.
Es posible que desee agregar un control de tipo de ejecución que T es en realidad un tipo de enumeración (por ejemplo typeof(T).BaseType == typeof(Enum)
)
Aquí hay un programa completo que demuestra que funcione:
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));
}
}
Sólo una nota: En C# 4 la estructura de enumeración proporciona un método HasFlag estándar(). –