Vergleichen von Enum-Flags in C #
Ich muss feststellen, ob ein Flag innerhalb eines Aufzählungswerts gesetzt ist, welcher Typ mit dem Flag-Attribut gekennzeichnet ist.
Normalerweise ist es so gemacht:
(value & flag) == flag
Aber da ich dies generisch machen muss (manchmal habe ich zur Laufzeit nur eine "Enum" -Referenz. Ich kann keinen einfachen Weg finden, den & -Operator zu verwenden. Im Moment mache ich es so:
public static bool IsSet<T>(this T value, T flags) where T : Enum
{
Type numberType = Enum.GetUnderlyingType(typeof(T));
if (numberType.Equals(typeof(int)))
{
return BoxUnbox<int>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(sbyte)))
{
return BoxUnbox<sbyte>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(byte)))
{
return BoxUnbox<byte>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(short)))
{
return BoxUnbox<short>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(ushort)))
{
return BoxUnbox<ushort>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(uint)))
{
return BoxUnbox<uint>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(long)))
{
return BoxUnbox<long>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(ulong)))
{
return BoxUnbox<ulong>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(char)))
{
return BoxUnbox<char>(value, flags, (a, b) => (a & b) == b);
}
else
{
throw new ArgumentException("Unknown enum underlying type " + numberType.Name + ".");
}
}
private static bool BoxUnbox<T>(object value, object flags, Func<T, T, bool> op)
{
return op((T)value, (T)flags);
}
Aber ich mag die endlosen if-else-Blöcke nicht. Gibt es also eine Möglichkeit, diese Werte zu konvertieren, die ich mit dem Operator & oder einer anderen Lösung überprüfen kann?