Devo rilevare se un flag è impostato all'interno di un valore enum, quale tipo è contrassegnato con l'attributo Flag.Confronto tra flag enum in C#
Di solito è fatto così:
(value & flag) == flag
Ma dal momento che ho bisogno di fare questo generici (a volte a caso runtime ho solo un riferimento "Enum" Non riesco a trovare un modo semplice da usare. . l'operatore & al momento mi rendono in questo modo:
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);
}
Ma non mi piace il senza fine, se - blocchi altro, quindi c'è un modo per lanciare questi valori che posso utilizzare l'operatore & o qualsiasi altra soluzione per verificare questo?
Una domanda simile può essere trovata qui: http://stackoverflow.com/questions/746905/get-integral-value-of-boxed-enum – Kirtan
Ancora un altro motivo per cui C# ha bisogno di un vincolo enum generico: http://stackoverflow.com/questions/7244 – Keith