Переключатель с enum и множественным возвратом
У меня есть два объекта:
public enum BugReportStatus
{
OpenUnassigned = 0,
OpenAssigned = 1,
ClosedAsResolved = 2,
ClosedAsRejected = 3
}
а также
public enum BugReportFilter
{
Open = 1,
...
Closed = 4,
}
И я хотел бы создать switch case
где в зависимости от BugReportFilter
выберите мой вывод будет конкретным BugReportStaus
,
Итак, я создал метод CheckFilter
private BugReportStatus Checkfilter(BugReportFilter filter)
{
switch (filter)
{
case BugReportFilter.Open:
return BugReportStatus.OpenAssigned;
case BugReportFilter.Closed:
return BugReportStatus.ClosedAsResolved;
}
};
Проблема в том, что в случае BugReportFilter.Open
вариант я должен вернуться BugReportStatus.OpenAssigned
А ТАКЖЕ BugReportStatus.OpenUnassigned
Есть ли способ объединить эти два варианта в одном возвращении?
5 ответов
Вы могли бы вернуться IEnumerable<BugReportStatus>
:
private IEnumerable<BugReportStatus> Checkfilter(BugReportFilter filter)
{
switch (filter)
{
case BugReportFilter.Open:
return new[]{ BugReportStatus.OpenAssigned, BugReportStatus.OpenUnassigned };
case BugReportFilter.Closed:
return new[]{ BugReportStatus.ClosedAsResolved };
}
};
Тогда вы могли бы использовать Enumerable.Contains
проверить, если это Fe BugReportStatus.OpenAssigned
:
bool isOpenAssigned = Checkfilter(someFiler).Contains(BugReportStatus.OpenAssigned);
Сделайте параметры силой двух, например
public enum Flags
{
A = 1,
B = 2,
C = 4
}
затем вернитесь Flags.B | Flags.A
из вашей функции (тип возвращаемого значения должен быть int
).
Вот как проверить, установлен ли флаг
bool isA = (enumFlag & Flags.A) != 0; // true means A is set
Для получения дополнительной информации, пожалуйста, смотрите здесь.
Для вашего случая я рекомендую представлять результат в разных битах (используя концепцию флагов), чтобы вы могли согласовать результат:
public enum BugReportStatus
{
OpenUnassigned = 1, //0000 0001
OpenAssigned = 2, //0000 0010
ClosedAsResolved = 4, //0000 0100
ClosedAsRejected = 8 //0000 1000
}
Таким образом, вы можете сделать это:
switch (filter)
{
case BugReportFilter.Open:
return BugReportStatus.OpenAssigned + BugReportStatus.OpenUnassigned; //return 3
case BugReportFilter.Closed:
return BugReportStatus.ClosedAsResolved;
}
И измените свой тип возврата на что-то вроде int
:
private int Checkfilter(BugReportFilter filter)
И чтобы проверить результат снаружи, просто проверьте, какой флаг существует в int
вернуть
Как насчет возврата перечислимого?
private IEnumerable<BugReportStatus> Checkfilter(BugReportFilter filter)
{
switch (filter)
{
case BugReportFilter.Open:
return new List<BugReportStatus>()
{
BugReportStatus.OpenAssigned,
BugReportStatus.OpenUnassigned
};
case BugReportFilter.Closed:
return new List<BugReportStatus>()
{
BugReportStatus.ClosedAsResolved,
BugReportStatus.ClosedAsRejected
};
default: return null;
}
}
Вы можете использовать атрибут Flags для достижения этой цели. Чтобы использовать это, вам нужно увеличить значения enum для BugReportStatus
по степеням 2, поскольку перечисление рассматривается как битовое поле. Вам также нужно украсить перечисление [Flags]
приписывать. Например
[Flags]
public enum BugReportStatus
{
OpenUnassigned = 1,
OpenAssigned = 2,
ClosedAsResolved = 4,
ClosedAsRejected = 8
}
Затем вы можете вернуть несколько значений, таких как: return BugReportStatus.OpenAssigned | BugReportStatus.OpenUnassigned;
Вы можете использовать Enum.HasFlags
метод, чтобы проверить, было ли установлено определенное битовое поле. Например
Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.OpenAssigned) // true
Checkfilter(BugReportFilter.Open).HasFlag(BugReportStatus.ClosedAsResolved) // false