Иногда при чтении чужого кода C # я вижу метод, который принимает несколько значений перечисления в одном параметре. Я всегда думал, что это изящно, но никогда не разбирался в этом.
Что ж, теперь я думаю, что мне это может понадобиться, но не знаю, как
- настроить подпись метода, чтобы принять это
- работать со значениями в методе
- определить перечисление
для достижения такого рода вещей.
В моей конкретной ситуации я хотел бы использовать System.DayOfWeek, который определяется как:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Я хочу иметь возможность передавать одно или несколько значений DayOfWeek моему методу. Смогу ли я использовать это конкретное перечисление как есть? Как мне делать 3 перечисленных выше дела?
Ответы:
Когда вы определяете перечисление, просто присвойте ему атрибут [Flags], установите значения в степени двойки, и это будет работать таким образом.
Больше ничего не меняется, кроме передачи в функцию нескольких значений.
Например:
Дополнительные сведения см. В документации MSDN по типам перечисления .
Редактировать в ответ на дополнения к вопросу.
Вы не сможете использовать это перечисление как есть, если только не захотите передать его как массив array / collection / params. Это позволит вам передать несколько значений. Синтаксис flags требует, чтобы Enum был указан как flags (или чтобы убрать язык так, как он не предназначен).
источник
Я думаю, что более элегантным решением будет использование HasFlag ():
источник
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Я второй ответ Рида. Однако при создании перечисления вы должны указать значения для каждого члена перечисления, чтобы получилось своего рода битовое поле. Например:
источник
Вы не можете использовать System.DayOfWeek в качестве
[Flags]
перечисления, потому что вы не можете его контролировать. Если вы хотите иметь метод, который принимает несколько,DayOfWeek
вам нужно будет использоватьparams
ключевое словоВ противном случае вы можете создать собственное
[Flags]
перечисление, как указано многими другими респондентами, и использовать побитовые сравнения.источник
Вы должны указать числа и увеличивать их таким образом, потому что он сохраняет значения поразрядным образом.
Затем просто определите свой метод, чтобы получить это перечисление
и чтобы назвать это, сделайте что-нибудь вроде
Чтобы проверить, было ли включено одно из значений перечисления, проверьте их с помощью побитовых операций, таких как
источник
вызвать метод в этом формате
ИмяМетода (ДнейОфНеделя.Вторник | ДнейОфНеделя.Четверг);
Реализуйте метод EnumToArray, чтобы получить переданные параметры
источник
Отметьте ваше перечисление атрибутом [Flags]. Также убедитесь, что все ваши значения являются взаимоисключающими (два значения не могут в сумме равняться другому), например 1,2,4,8,16,32,64 в вашем случае
Если у вас есть метод, который принимает перечисление DayOfWeek, используйте побитовый оператор или (|), чтобы использовать несколько членов вместе. Например:
Для того, чтобы проверить , если параметр содержит элемент конкретны, побитовое и оператор (&) с элементом , который вы проверяете для.
источник
Рид Копси прав, и я бы добавил к исходному сообщению, если бы мог, но я не могу, поэтому мне придется ответить вместо этого.
Опасно просто использовать [Flags] в любом старом перечислении. Я считаю, что вам нужно явно изменить значения перечисления на степени двойки при использовании флагов, чтобы избежать конфликтов в значениях. См. Рекомендации для FlagsAttribute и Enum .
источник
С помощью опубликованных ответов и этих:
Я чувствую, что понимаю это очень хорошо.
Спасибо.
источник
Что-то в этом роде должно показать то, что вы ищете:
источник