С# Получить все значения перечисления больше заданного значения?
У меня есть следующее перечисление ролей членства:
public enum RoleName
{
RegisteredUser,
Moderator,
Administrator,
Owner
}
Я хочу иметь возможность извлекать все роли, больше или равные заданной роли.
Например, я ввожу Администратора, и я получаю IEnumerable с RoleName.Administration
и RoleName.Owner
Что-то в этом роде:
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);
}
}
Ответы
Ответ 1
Вы можете использовать следующий вспомогательный метод, чтобы дать вам набор ролей, разрешенных для данной роли:
private IEnumerable<RoleName> AllAllowedRoles(RoleName level)
{
return Enum.GetValues(typeof(RoleName)).Cast<RoleName>().Where(role => level >= role);
}
И затем назначьте все из них пользователю.
Ответ 2
Возможно, в зависимости от версии .NET. Но это очень хорошо для меня:
Нет необходимости конвертировать или использовать специальные трюки. Просто сравните с обычными операторами:
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();
}
}
Ответ 3
чтобы иметь лучшее определение, значение которого больше, чем другое, вам нужно назначить числовые значения следующим ролям:
public enum RoleName
{
RegisteredUser = 2,
Moderator = 4,
Administrator = 8,
Owner = 16
}
Теперь, если вы нажмете какой-либо экземпляр типа RoleName на (int), вы получите числовое значение и, следовательно, вы сможете сравнивать их друг с другом.
Примечание:
1. Здесь я использую полномочия 2 как значения, позволяющие комбинировать имена ролей с использованием бит-мудирующих операторов.
Ответ 4
пошел с этим:
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);
}
Ответ 5
Ваш код точно правильный, за исключением того, что вам нужно Cast<int>()
, и вам не нужно ToList()
.
Ответ 6
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;
}
Вы можете проверить это Можете ли вы просмотреть все значения перечисления?
Ответ 7
Вы должны учитывать основной тип перечисления. Таким образом:
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);
}