как мне включить перечисление, у которого установлен атрибут флагов (или, точнее, используется для бит-операций)?
Я хочу, чтобы ударить все случаи в коммутаторе, который соответствует объявленным значениям.
Проблема заключается в том, что если я имею следующее перечисление
[Flags()]public enum CheckType
{
Form = 1,
QueryString = 2,
TempData = 4,
}
и я хочу использовать такой переключатель
switch(theCheckType)
{
case CheckType.Form:
DoSomething(/*Some type of collection is passed */);
break;
case CheckType.QueryString:
DoSomethingElse(/*Some other type of collection is passed */);
break;
case CheckType.TempData
DoWhatever(/*Some different type of collection is passed */);
break;
}
Если "theCheckType" установлен как для CheckType.Form | CheckType.TempData Я хочу, чтобы он ударил обоих. Очевидно, что это не ударит в моем примере из-за перерыва, но кроме этого он также терпит неудачу, потому что CheckType.Form не равен CheckType.Form | CheckType.TempDatap >
Единственное решение, как я вижу, это сделать случай для каждой возможной комбинации значений enum?
Что-то вроде
case CheckType.Form | CheckType.TempData:
DoSomething(/*Some type of collection is passed */);
DoWhatever(/*Some different type of collection is passed */);
break;
case CheckType.Form | CheckType.TempData | CheckType.QueryString:
DoSomething(/*Some type of collection is passed */);
DoSomethingElse(/*Some other type of collection is passed */);
break;
... and so on...
Но это действительно не очень желательно (так как оно быстро вырастет очень сильно)
Сейчас у меня есть 3 Если условия сразу после eachother вместо
Что-то вроде
if ((_CheckType & CheckType.Form) != 0)
{
DoSomething(/*Some type of collection is passed */);
}
if ((_CheckType & CheckType.TempData) != 0)
{
DoWhatever(/*Some type of collection is passed */);
}
....
Но это также означает, что если у меня есть перечисление с 20 значениями, он должен пройти через 20 Если условия каждый раз вместо "прыжка" только в необходимый "случай" /при использовании переключателя.
Есть ли какое-то магическое решение для решения этой проблемы?
Я подумал о возможности прокрутки объявленных значений, а затем с помощью коммутатора, тогда он попадет только в коммутатор для каждого объявленного значения, но я не знаю, как он будет работать, и если это порог производительности - это хорошая идея (по сравнению с большим количеством if)?
Есть ли простой способ перебрать все объявленные значения перечисления?
Я могу только придумать использование ToString() и разбить на ",", а затем пропустить массив и проанализировать каждую строку.
UPDATE:
Я вижу, что я не очень хорошо объяснил работу. Мой пример - простой (попытался упростить мой сценарий).
Я использую его для ActionMethodSelectorAttribute в MVC Asp.net, чтобы определить, должен ли быть доступен метод при разрешении URL-адреса/маршрута.
Я делаю это, объявляя что-то вроде этого в методе
[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
return View();
}
Это означало бы, что он должен проверить, имеет ли форма или TempData ключ, указанный для способа, который будет доступен.
Методы, которые он будет вызывать (doSomething(), doSomethingElse() и doWhatever() в моем предыдущем примере) на самом деле будут иметь значение bool как возвращаемое значение и будут вызываться с параметром (разные коллекции, не разделяющие интерфейс которые можно использовать - см. мой пример кода в ссылке ниже и т.д.).
Чтобы надеяться дать лучшее представление о том, что я делаю, я вставил простой пример того, что я на самом деле делаю на pastebin - его можно найти здесь http://pastebin.com/m478cc2b8