繁体   English   中英

如何用标志枚举属性展平对象集合?

[英]How to Flatten a Collection of Objects with Flag Enum Properties?

我有一个Role对象,它将具有几个flag枚举属性,每个相关对象一个。 一个用户可以属于多个角色。 我想获取角色集合并将其展平为单个表示形式,并使用它来限制UI功能。 如何展平藏品?

这是我的LINQPad测试中的一些示例代码:

ICollection<Role> roles = new List<Role>();

roles.Add(new Role {
    Name = "Administrator",
    Object1Defaults = DefaultPermissions.Add | DefaultPermissions.Edit | DefaultPermissions.Remove,
    Object2Defaults = DefaultPermissions.Add | DefaultPermissions.Edit | DefaultPermissions.Remove
});
roles.Add(new Role {
    Name = "Manager",
    Object1Defaults = DefaultPermissions.Add | DefaultPermissions.Edit,
    Object2Defaults = DefaultPermissions.Add | DefaultPermissions.Edit
});

public class Role {
    public string Name { get; set; }
    public DefaultPermissions Object1Defaults { get; set; }
    public DefaultPermissions Object2Defaults { get; set; }
}

[Flags]
public enum DefaultPermissions {
    Add = 1 << 0,
    Edit = 1 << 1,
    Remove = 1 << 2
}

当然,我也乐于接受有关实现权限的更好方法的建议。 我的计划是在Role中的数据库中为每个其他对象提供一个枚举,就像使用Object1DefaultsObject2Defaults一样,在每个视图中都使用一个枚举,除了使用更好的名称以及更多名称。

首先,我建议不要将枚举用作标志。 它限制了您可以拥有的总数,这现在可能不是问题,但是如果您日后用完一点点将是一个大问题。 因此,使您的权限容器成为一个集合。

一旦这样做,就可以使用linq将结果展平为一个数组(或List或任何您想要的东西):

var result = roles.SelectMany(x => Object1Defaults).Distinct().ToArray();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM