В приложении, которое я создаю, у меня было перечисление статусов аккаунта:
public enum AccountStatus
{
Active = 1,
Trial = 2,
Canceled = 3
}
Однако мне нужно было больше информации из AccountStatus, поэтому я создал класс, который имеет несколько дополнительных полезных свойств:
public class AccountStatus
{
public int Id {get; set;}
public string Description {get; set;}
public bool IsActive {get; set;}
public bool CanReactivate {get; set;}
}
Этот класс заполняется из таблицы базы данных, которая может выглядеть следующим образом:
1, "Active", True, True
2, "Trial", True, True
3, "ExpiredTrial", False, True
4, "Expelled", False, False
Это очень удобно, когда у меня есть объект customer, который использует AccountStatus, потому что я могу написать код вроде:
if(customer.Status.CanReactivate) // Show reactivation form
Однако я потерял нечто не менее важное. Я больше не могу сделать это:
if(customer.Status == AccountStatus.Active) // allow some stuff to happen
Что было бы лучшим способом, если это вообще возможно, включить что-то, что позволит мне подражать перечислению в классе. Я знаю, что могу добавить открытые статические поля в класс AccountStatus, но в конечном итоге это не сработает, потому что, если база данных изменится, код придется обновить вручную. Под этим я подразумеваю:
public static readonly AccountStatus Active = new AccountStatus(1);
public static readonly AccountStatus Trial = new AccountStatus(2);
// etc, etc ...
Я предполагаю, что где-то есть образец этого, я просто не знаю, как это называется.
Есть идеи?
ПОЯСНЕНИЯ
Основываясь на ответах, мне нужно уточнить пару вещей.
Таблица выше является кратким примером. В моей фактической таблице есть много записей, у меня там 12 прямо сейчас. Плюс мы можем добавить еще или удалить некоторые из существующих. Это то, что я имел в виду под «динамическим» в заголовке моего вопроса.
Во-вторых, я привел очень простой случай использования потерянной способности, что, по-видимому, запутало ситуацию. Вот еще один реальный пример:
if(customer.Status == AccountStatus.Trial || customer.Status == AccountStatus.ExpiredTrial)
... ни Trial, ни ExpiredTrial не являются логическими значениями свойства. Я тоже не хочу их добавлять. Это создаст еще худший прецедент, чем тот, который я пытаюсь избежать (это означает, что мне придется добавлять новое свойство в класс каждый раз, когда я добавляю новую запись в таблицу).
UPDATE
Я выбрал ответ, который на самом деле не встречал, я искал, но предполагает, что я искал что-то ненужное. Подумав об этом, я согласен. Хотя добавление перечислимых или статических полей дублирует некоторую работу (т. Е. Наличие значений как в коде, так и в таблице), я думаю, что преимущества перевешивают негативы.