c#是否获取大于给定值的所有枚举值
本文关键字:枚举 是否 获取 大于 | 更新日期: 2023-09-27 18:03:25
我有以下成员角色的枚举:
public enum RoleName
{
RegisteredUser,
Moderator,
Administrator,
Owner
}
我希望能够获取大于或等于给定角色的所有角色。
例如,我输入Administrator,得到一个带有RoleName.Administration
和RoleName.Owner
的IEnumerable
这类东西:
public static void AddUserToRole(string username, RoleName level)
{
var roles = Enum.GetValues(typeof(RoleName)).Cast<R>().ToList().Where(role => level > role);
foreach (var role in roles)
{
Roles.AddUserToRole(username, role);
}
}
可能取决于.NET的版本。但这对我来说效果很好:
没有必要转换或使用特殊的技巧。只需与普通运营商进行比较:
using System;
enum Test { a1, a2, a3, a4 }
class Program
{
static void Main(string[] args)
{
Test a = Test.a2;
Console.WriteLine((a > Test.a1));
Console.WriteLine((a > Test.a2));
Console.WriteLine((a > Test.a3));
Console.WriteLine((a > Test.a4));
Console.ReadKey();
}
}
输出:
True
False
False
False
您可以使用以下助手方法为给定角色提供一组允许的角色:
private IEnumerable<RoleName> AllAllowedRoles(RoleName level)
{
return Enum.GetValues(typeof(RoleName)).Cast<RoleName>().Where(role => level >= role);
}
然后将它们全部分配给用户。
为了更好地定义哪个角色比另一个角色大,您需要为角色分配数值,如下所示:
public enum RoleName
{
RegisteredUser = 2,
Moderator = 4,
Administrator = 8,
Owner = 16
}
现在,如果您将任何类型为RoleName的实例强制转换为(int(,您将获得数值,因此您可以将它们相互比较。
注意:
1.在这里,我使用2的幂作为值,以允许使用逐位运算符组合RoleNames。
使用了这个:
public static void AddUserToRole(string username, RoleName level)
{
var roles = RolesLesserThanOrEqualTo(level);
foreach (var role in roles)
{
Roles.AddUserToRole(username, role.Name());
}
}
public static IEnumerable<RoleName> RolesLesserThanOrEqualTo(RoleName level)
{
return Enum.GetValues(typeof(RoleName)).Cast<RoleName>().Where(role => level >= role);
}
除了需要Cast<int>()
和不需要ToList()
之外,您的代码是完全正确的。
public enum RoleName : int
{
RegisteredUser = 7,
Moderator = 8,
Administrator = 9,
Owner = 10
}
public List<RoleName> GetGreaterOrEqual(RoleName role)
{
List<RoleName> list = new List<RoleName>();
foreach (RoleName rn in Enum.GetValues(typeof(RoleName)))
{
if(rn >= role)
list.Add(rn);
}
return list;
}
你可以看看这个。你能循环所有的枚举值吗?
您必须考虑枚举的底层类型。因此:
static IEnumerable<T> Get<T>(T value) where T : struct {
Type underlyingType = Enum.GetUnderlyingType(typeof(T));
var compareToMethod = underlyingType.GetMethod(
"CompareTo",
new[] { underlyingType }
);
var values = Enum.GetValues(typeof(T));
for (int index = 0; index < values.Length; index++) {
int comparison = (int)compareToMethod.Invoke(
Convert.ChangeType(value, underlyingType),
new object[] { values.GetValue(index) }
);
if (comparison >= 0) {
yield return (T)values.GetValue(index);
}
}
}
我不想想出一个好名字,但这很管用:
var largerValues = Get<RoleName>(RoleName.Moderator);
foreach(var largerValue in largerValues) {
Console.WriteLine(largerValue);
}