在我的项目中,我使用的是一个bool数组,它定义了用户的访问权限。 例如
public bool[] Security {get; set;}
,其中
[0] = Admin
[1] = GrantWrites
[2] = GrantDeletes
[3] = User
工作得很好。 我将它设置为{F,T,F,T}或{0,1,0,1},并且该特定用户可以作为用户进行访问,并允许他写入。
我正在尝试将其转换为枚举,但显然我需要一个数组。
目前我有以下(不工作)
public class UserCrops
{
public UserCrops(etc.., Enum[] _Security)
{
.
.
.
Security = _Security;
}
.
.
.
public Enum[] Security
{
Admin,
GrantWrites,
GrantDeletes,
User
}
}
我找到了一些像this这样的链接但没有帮助。
提前致谢
编辑:这两个答案都得到了很好的解释,但我会选择非旗帜,因为它对我来说似乎更容易:)
Edit2:我如何创建一个新对象(在课外?) 我曾经做过
bool[] security = new bool[9];
for (int i = 0; i < 9; i++)
{
security[i] = chklstSecurity.Items[i].Selected;
}
userCropList.Add(new UserCrops(.., txtBiologicalAssessmentApprovalDate.Text, security));
但是现在?
答案 0 :(得分:7)
尝试:
[Flags]
public enum Security
{
Admin = 1,
GrantWrites = 2,
GrantDeletes = 4,
User = 8
}
你会像这样使用它:
Security security = Security.GrantWrites | Security.GrantDeletes;
if ((security & Security.GrantWrites) == Security.GrantWrites)
{
}
p.s.w.g.指出的比较可以简化,以提高其可读性。此外,我建议在enum
中包含一个默认值(对于未初始化变量的时间):
[Flags]
public enum Security
{
None = 0,
Admin = 1,
GrantWrites = 2,
GrantDeletes = 4,
User = 8
}
最后请注意,您可以为标志的常见组合提供快捷方式:
[Flags]
public enum Security
{
// Other values
FullAccess = Admin | GrantWrites | GrantDeletes
}
更多关于MSDN的内容。请注意,此方法模仿文件系统(以及许多其他文件)中文件/目录的属性。使用IMO比使用other answer:
中建议的枚举数组要简单得多null
值(enum
不能为null
,数组可以是。)但与此相比,它有两个主要缺点:
Int32
使用enum
或为Int64
使用64,则为32。Security
必须成为一个类,你需要编写更多代码来模仿枚举语法和一些使用枚举时代码所做的假设将被破坏。答案 1 :(得分:6)
删除[]
并使用enum
代替Enum
:
public enum Security
{
Admin,
GrantWrites,
GrantDeletes,
User
}
您可能希望使用Security[]
作为方法参数:
public UserCrops(etc.., Security[] _Security)
使用标记(作为Adriano suggests)也是一个很好的建议,但它需要您重新考虑如何存储您的权限。您不是存储bool
数组,而是将整个安全集表示为单个值,不同的位代表每个权限。
阅读枚举类型为位标志部分下的Enumeration Types (C# Programming Guide)以获取更多信息。