Какой правильный способ получения моих пользовательских классов перечисления по их значению?
Я создал свои собственные псевдо перечисления в моей доменной модели, чтобы позволить мне иметь более подробные значения. Например, мой класс выглядит следующим образом:
public abstract class Enumeration<X, Y> : IComparable where X : IComparable
{
public Enumeration(X value, Y displayName) { }
public Y DisplayName { get { return _displayName; } }
public X Value { get { return _value; } }
}
И класс, который наследует это будет:
public class JobType : Enumeration<string, string>
{
public static JobType ChangeOver = new JobType("XY01", "Changeover");
public static JobType Withdrawal = new JobType("XY02", "Withdrawal");
public static JobType Installation = new JobType("XY03", "Installation");
private JobType(string jobTypeId, string description)
: base(jobTypeId, description) { }
}
У меня проблема в том, что я хочу иметь возможность разрешать эти значения из значения, возвращенного из базы данных в моем хранилище. Так что я за такой метод, как:
public static JobType Resolve(string jobTypeId) { return matchingJobType; }
Я начал писать метод разрешения для каждого класса перечисления, но должен быть лучший способ, чем дублировать один и тот же метод с оператором switch в каждом?
Я думал о добавленииDictionary<X, Enumeration<X, Y>> Cache;
свойство к базовому классу и добавление в него класса из конструктора базового класса. Это также будет способствовать обеспечению уникальных ценностей. Проблема с этим заключается в том, что когда я получаю перечисление из словаря,Enumeration<X, Y>
и я хочу это какJobType
.
Таким образом, это означает, что необходимо добавить третий универсальный тип в класс Enumeration и иметь:
public static T Resolve(X value); // With the additional type
public static T Resolve<T>(X value); // Or without an additional type
Мне явно не нравится идея писатьJobType.Resolve<JobType>(foo);
и то, что я хочу, это простоJobType.Resolve(foo);
, но это должно быть сделано с как можно меньшим количеством кода. То есть можно ли все это просто обработать из базового класса, не добавляя дополнительный универсальный тип?