【问题标题】:How to Flatten a Collection of Objects with Flag Enum Properties?如何使用标志枚举属性展平对象集合?
【发布时间】:2014-05-01 22:11:42
【问题描述】:

我有一个Role 对象,它有几个标志枚举属性,每个相关对象都有一个。一个用户可以属于多个角色。我想获取角色集合并将其展平为单个表示并使用它来限制 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 一样,在每个视图中都可以使用,除了更好的名称和更多名称。

【问题讨论】:

    标签: c# asp.net-mvc enums asp.net-mvc-5 asp.net-identity


    【解决方案1】:

    首先,我建议不要使用枚举作为标志。它限制了您总共可以拥有多少个,这现在可能不是问题,但如果您以后用完比特,这将是一个大问题。所以让你的权限容器成为一个集合。

    一旦你这样做了,使用 linq,很容易将结果展平为一个数组(或列表,或任何你想要的):

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-12
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多