C# 设计级问题:多个枚举或在UI代码中循环枚举以做出可见性决策?

C# 设计级问题:多个枚举或在UI代码中循环枚举以做出可见性决策?,c#,enums,C#,Enums,我们从.NET体系结构设计的角度讨论了最佳实践: 任务:如何使用枚举管理UI中基于角色的可见性 例如:我想向管理员显示所有团队类型[a、b、c、d、e],但仅向普通用户显示团队类型[a、b、c] 首先,我有enum,它包括所有团队类型: public enum TeamType { a, b, c, d, e } 我是这样使用它的: if (IsAdminitrator()) comboboxTeamtypes.Items.AddRange(Enum.GetNames(typeof(

我们从.NET体系结构设计的角度讨论了最佳实践:

任务:如何使用枚举管理UI中基于角色的可见性

例如:我想向管理员显示所有团队类型[a、b、c、d、e],但仅向普通用户显示团队类型[a、b、c]

首先,我有enum,它包括所有团队类型:

public enum TeamType { a, b, c, d, e }
我是这样使用它的:

if (IsAdminitrator()) 
    comboboxTeamtypes.Items.AddRange(Enum.GetNames(typeof(TeamType)));
现在我应该决定如何实现else子句。由于枚举无法继承,我有两种可选方法:

1) 我是否应该引入其他特定于角色的枚举:

public enum TeamTypeOthers {a, b, c }
然后我会:

else
    comboboxTeamtypes.Items.AddRange(Enum.GetNames(typeof(TeamTypeOthers)));
2) 或者我是否应该忘记创建任何特定于角色的枚举TeamTypeOthers,而只是在UI代码中循环原始TeamTypeEnum值:

else
{
    foreach (TeamType teamtype in Enum.GetValues(typeof(TeamType)))
    {
        if (asdf == TeamType.a)
            comboboxTeamtypes.Items.Add(teamtype);
        else if (asdf == TeamType.b)
            comboboxTeamtypes.Items.Add(teamtype);
        if (asdf == TeamType.c)
            comboboxTeamtypes.Items.Add(teamtype);
    }
}

我认为第一个解决方案是好的和干净的(虽然重复,这不是很好)。但现在我也决定在比解决方案2中更深层的体系结构中使用enum,这可能是不好的,并且支持使用解决方案2。对我来说,解决方案2既丑陋又混乱,因为我不喜欢围绕代码进行循环培养。

你的编程语言是什么?在Java中,我会告诉您创建如下所示的enum类,但显然这不是Java

public enum TeamType {
    A(false), B(false), C(false), D(true), E(true);
    private final boolean isAdmin;
    public TeamType(boolean isAdmin) {
        this.isAdmin = isAdmin;
    }
    public boolean isAdmin() {
        return this.isAdmin;
    }
}

我会稍作更改,并使用简单的位屏蔽权限:

public enum TeamType
{
    a = 1, // or 00001
    b = 2, // or 00010
    c = 4, // or 00100
    d = 8, // or 01000
    e = 16 // or 10000
}
然后每个用户类型获得其权限级别集(每个可用权限加在一起):

然后,当您在UI中填充下拉列表时,位屏蔽就会出现:

comboboxTeamTypes.Items.AddRange(
    Enum.GetValues(typeof(TeamType))
        .Where(v => myLevel & v == v)
        .Select(v => Enum.GetName(typeof(TeamType), v));

谢谢,很好的方法。也许我表达我的观点有点含糊。问题更像是,当您可以使用单个枚举并决定如何在UI代码中使用它时,使用重复枚举并不是很好的编码。这意味着UI中有更多的代码,但在更深层次上,有更通用或更清晰的解决方案不知道它的用途。如果我有一个类,我可以使用继承来解决这类问题。。。
comboboxTeamTypes.Items.AddRange(
    Enum.GetValues(typeof(TeamType))
        .Where(v => myLevel & v == v)
        .Select(v => Enum.GetName(typeof(TeamType), v));