0

在我的项目中,我使用了一个定义用户访问权限的布尔数组。例如

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
    }

}

我找到了一些这样的链接,没有帮助。

提前致谢

编辑:这两个答案都得到了很好的解释,但我选择非标志的答案只是因为它对我来说似乎更容易:)

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));

但现在?

4

2 回答 2

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)
{
}

如pswg所指出的,可以简化比较以增加其可读性。此外,我建议在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 使用起来比其他答案中建议的保留枚举数组要简单得多:

  • 您不必搜索整个数组来检查是否授予了权限。
  • 您不必检查null值(enum不能null,数组可以)。
  • 它使用更少的空间(即使现在这不是那么重要)。
  • 它自然(更)安全,因此需要更少的检查(例如避免数组内的重复)。
  • 它可以很容易地存储(作为文本或整数,无需额外代码)。

但与此相比,它有两个主要缺点:

  • 标志是有限的(如果您使用的是 32 的Int32for yourenum或 64 的Int64)。
  • 您不能轻易切换到其他东西(例如,如果Security必须成为一个类,您将需要编写更多代码来模仿枚举语法,并且在使用枚举时代码所做的一些假设将被打破)。
于 2013-11-06T07:13:55.890 回答
6

删除[]并使用enum而不是Enum

public enum Security
{
    Admin,
    GrantWrites,
    GrantDeletes,
    User
}

您可能希望Security[]用作方法参数:

public UserCrops(etc.., Security[] _Security) 

使用标志(正如Adriano所建议的)也是一个很好的建议,但它需要您重新考虑如何存储您的权限。您无需存储 's 数组,而是bool将整个安全集表示为单个值,用不同的位表示每个权限。

阅读Enumeration Types as Bit Flags部分下的Enumeration Types (C# Programming Guide)了解更多信息。

于 2013-11-06T07:13:32.963 回答