Ho un tipo enum per i privilegi utente che assomiglia a questo:Rimuovi privilegio enum bandiere nel modo giusto in 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
}
Questi valori sono destinati a CheckBoxes nella GUI con un convertitore di valori. (Ho voluto fare questo il più generico possibile, perché ci sono anche diversi privilegi [es] 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());
}
}
Questo funziona davvero bene per la visualizzazione e l'aggiunta di privilegi per l'utente nella GUI. Funziona anche per rimuovere Superflags come Supervisor (tutti i flag >=
vengono rimossi Supervisor, gli altri flag non cambiano).
Il problema è quando deseleziono Importa, ad esempio, voglio rimuovere tutti i Superflags (Supervisore, Amministratore) ma vorrei mantenere gli altri flag (Visualizza, Esporta).
0001 1111 // Admin
0000 0010 // Import
---------
0000 0101 // View | Export
Ma non ho idea di come ottenere ciò. Anyboy che ha una buona soluzione per questo?
Stai cercando di evitare l'uso della logica condizionale? Se inizi a scrivere questo codice con istruzioni if / else, è piuttosto semplice. – Candide
Nel tuo esempio: ti piace rimuovere 'Admin' e' Importa'? – Mzf
@Candide Voglio mantenerlo il più generico possibile, quindi potrei usarlo anche per altri progetti o privilegi diversi. – Staeff