c# Get all enum values greater than a given value?
我列举了以下成员角色:
1 2 3 4 5 6 7 | public enum RoleName { RegisteredUser, Moderator, Administrator, Owner } |
我希望能够获取大于或等于给定角色的所有角色。
例如,我输入administrator,我用
类似的事情:
1 2 3 4 5 6 7 8 9 | 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的版本。但这对我来说很有效:
不需要转换或使用特殊技巧。只需与通常的运算符进行比较:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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(); } } |
可以使用以下助手方法为给定角色提供一组允许的角色:
1 2 3 4 | private IEnumerable<RoleName> AllAllowedRoles(RoleName level) { return Enum.GetValues(typeof(RoleName)).Cast<RoleName>().Where(role => level >= role); } |
然后将它们全部分配给用户。
为了更好地定义哪个角色大于另一个角色,您需要为角色分配数字值,如下所示:
1 2 3 4 5 6 7 | public enum RoleName { RegisteredUser = 2, Moderator = 4, Administrator = 8, Owner = 16 } |
现在,如果您将rolename类型的任何实例强制转换为(int),您将得到数值,因此您可以将它们相互比较。
注:1。这里,我使用2的幂作为值,以允许使用位运算符组合角色名。
随之而来的是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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); } |
必须考虑枚举的基础类型。因此:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } } } |
我不想想出一个好名字,但这很管用:
1 2 3 4 | var largerValues = Get<RoleName>(RoleName.Moderator); foreach(var largerValue in largerValues) { Console.WriteLine(largerValue); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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; } |
你可以检查这个,你能循环所有枚举值吗?
您的代码完全正确,只不过您需要