C# 设计级问题:多个枚举或在UI代码中循环枚举以做出可见性决策?
我们从.NET体系结构设计的角度讨论了最佳实践: 任务:如何使用枚举管理UI中基于角色的可见性 例如:我想向管理员显示所有团队类型[a、b、c、d、e],但仅向普通用户显示团队类型[a、b、c] 首先,我有enum,它包括所有团队类型: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(
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));