mam typu enum dla uprawnień użytkownika, który wygląda tak:Usuń przywilej flagi enum właściwy sposób w C#
[Flags]
public enum UserPrivileges : byte
{
None = 0, // 0000 0000
View = 1 << 0, // 0000 0001
Import = 1 << 1, // 0000 0010
Export = 1 << 2, // 0000 0100
Supervisor = View | Import | Export | 1 << 3, // 0000 1111
Admin = Supervisor | 1 << 4 // 0001 1111
}
Wartości te są zobowiązane do wyboru w GUI z przetwornikiem wartości. (Chciałem zrobić to jako rodzajowy, jak to możliwe, ponieważ istnieją również różne przywileje [np EmployeePrivileges])
public class ByteFlagsEnumValueConverter : IValueConverter
{
private byte _targetValue;
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var mask = (byte)parameter;
_targetValue = (byte)value;
return ((mask | _targetValue) == _targetValue);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
var mask = (byte)parameter;
if ((bool)value)
{
_targetValue |= mask;
}
else
{
// Get next superflag for mask (e.g. 0110 -> 1111)
var b = mask;
b--;
b |= (byte)(b >> 1);
b |= (byte)(b >> 2);
b |= (byte)(b >> 4);
b |= (byte)(b >> 8);
// if you remove a superflag (e.g. 1111) also remove
// everything higher than this flag
if (mask == b || mask == 1)
_targetValue &= (byte)(mask >> 1);
else
// ????????
}
return Enum.Parse(targetType, _targetValue.ToString());
}
}
To działa bardzo dobrze dla wyświetlania i dodawania uprawnień użytkownika w GUI. Działa również w celu usuwania Superflagów takich jak Supervisor (wszystkie flagi >=
Supervisora zostają usunięte, pozostałe flagi się nie zmieniają).
Problem polega na tym, że odznaczam Importuj, na przykład, chcę usunąć wszystkie Superflagi (Supervisor, Admin), ale chcę zachować pozostałe flagi (View, Export).
0001 1111 // Admin
0000 0010 // Import
---------
0000 0101 // View | Export
Ale nie wpadłem na dobry pomysł, jak to osiągnąć. Anyboy, który ma dobre rozwiązanie?
Czy próbujesz uniknąć używania logiki warunkowej? Jeśli zaczniesz kodować to za pomocą instrukcji if/else, to całkiem proste. – Candide
W twoim przykładzie - chcesz usunąć "Admin" i "Import"? – Mzf
@Candide Chcę zachować to jako ogólne, jak to możliwe, więc mógłbym użyć tego również dla innych projektów lub różnych przywilejów. – Staeff