switch со статистическими константами

Допустим, по какой-то причине я не хочу использовать enum'ы и для этого делаю статические поля с константными значениями:

class Priority
{
    public static Priority Low = new Priority(1, "Низкий");
    public static Priority Normal { get; } = new Priority(2, "Средний");
    public static Priority High { get; } = new Priority(3, "Высокий");
    public int Id { get; }
    public string Discription { get; }
    protected Priority(int id, string discription)
    {
        Id = id;
        Discription = discription;
    }
}

Проблема в том, что я не могу в этом случае использовать switch... Если я помечу поле, как const, то будет ругань на оператор new...

Если какая-нибудь хитрая конструкция языка, которая позволит мне сделать задуманное?

Да, можно через if'ы сделать, но они чуть массивные по сравнению со switch...


Ответы (1 шт):

Автор решения: Ivan G. Zakirov

Switch требует для проверки постоянное выражение. Предоставьте ему это, если уж так надо Switch (но свичи это плохая идея для чистого кода). При желании если правильно помню, можно организовать enum из которого можно вытаскивать int значение выбранного элемента (в случаях когда для БД требуется int.

public enum EnumIdPriority : int
{
    Low = 1,
    Normal = 2,
    High = 3
}
public class Priority
{
    public static Priority Low { get; } = new Priority(EnumIdPriority.Low, "Низкий");
    public static Priority Normal { get; } = new Priority(EnumIdPriority.Normal, "Средний");
    public static Priority High { get; } = new Priority(EnumIdPriority.High, "Высокий");
    public EnumIdPriority Id { get; }
    public string Discription { get; }
    internal Priority(EnumIdPriority id, string discription)
    {
        Id = id;
        Discription = discription;
    }
}

class SwitchPriority
{
    public void main()
    {
        Priority _Priority = new Priority(0, "sdasd");

        switch (_Priority.Id)
        {
            // Low
            case EnumIdPriority.Low:
                break;
            // Normal
            case EnumIdPriority.Normal:
                break;
            // High
            case EnumIdPriority.High:
                break;
            default:
                break;
        }
    }
}
→ Ссылка