Discord机器人角色判断:如何识别仅含Admin角色的用户
解决Discord机器人角色判断逻辑错误的问题
嘿,我一眼就揪出你代码里的问题啦——这是逻辑运算符优先级在搞鬼!
先给你拆解下原代码的问题:
你的判断表达式是:
x => x.Name == "Admin" || x.Name == "Head Recruiter" && x.Name != "Founder"
因为C#里&&的优先级比||高,所以这段代码实际会被解析成:
x => x.Name == "Admin" || (x.Name == "Head Recruiter" && x.Name != "Founder")
这就意味着,只要用户拥有Admin角色,不管他有没有Founder角色,这个条件都会返回true——完全不符合你想要的“仅Admin/Head Recruiter,无Founder”的要求。
正确的实现思路
我们需要的逻辑是:
- 用户必须没有
Founder角色 - 用户至少拥有
Admin或Head Recruiter中的一个角色
基于这个思路,给你两种高效的写法:
写法1:先提取角色集合(推荐,性能更好)
// 先把用户的所有角色名称提取到HashSet里,后续查询更快 var userRoleNames = fullContextUser.Roles.Select(role => role.Name).ToHashSet(); // 核心判断:无Founder,且有Admin或Head Recruiter return !userRoleNames.Contains("Founder") && (userRoleNames.Contains("Admin") || userRoleNames.Contains("Head Recruiter"));
写法2:用Any直接判断(更简洁)
// 先判断是否有Admin/Head Recruiter,再判断是否没有Founder return fullContextUser.Roles.Any(r => r.Name == "Admin" || r.Name == "Head Recruiter") && !fullContextUser.Roles.Any(r => r.Name == "Founder");
这里用Any()代替Count() > 0是更好的习惯,因为Any()找到第一个匹配项就会停止遍历,比Count()遍历所有角色更高效。
为什么这个逻辑能解决问题?
我们把“没有Founder”作为整个判断的前置条件,只要用户有Founder角色,不管他有没有Admin,整个表达式都会直接返回false,完美符合你要的“CheckUserIsAdminOnly”的归类要求。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

