gpt4 book ai didi

c# - 在 C# 中以正确的方式删除特权枚举标志

转载 作者:太空狗 更新时间:2023-10-29 21:50:42 24 4
gpt4 key购买 nike

我有一个用户权限的枚举类型,如下所示:

[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
}

这些值通过值转换器绑定(bind)到 GUI 中的复选框。 (我想这样做尽可能通用,因为还有不同的特权 [例如 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());
}
}

这对于在 GUI 中向用户显示和添加权限非常有效。它还适用于删除像 Supervisor 这样的 super 标志(所有标志 >= Supervisor 都被删除,其他标志不变)。

问题是当我取消选中导入时,例如,我想删除所有 super 标志(主管、管理员)但想保留其他标志(查看、导出)。

0001 1111 // Admin
0000 0010 // Import
---------
0000 0101 // View | Export

但是我还没有想出一个好主意如何完成这个。任何男孩对此有很好的解决方案吗?

最佳答案

如果我明白你想要什么,这应该可以完成工作

    byte tmp = 1 << 3 | 1 << 4;
byte removeSuperFlagMask = (byte) (~tmp);

byte notSuperflagsMask = 1 << 3 | 1 << 2 | 1 << 1;
if ((valueToRemove & notSuperflagsMask) != 0)
{
newValue = (byte)(removeSuperFlagMask & currentValue & ~valueToRemove);
}

关于c# - 在 C# 中以正确的方式删除特权枚举标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16939667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com