Я создал свои собственные псевдо перечисления в моей доменной модели, чтобы позволить мне иметь более подробные значения. Например, мой класс выглядит следующим образом:
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; }
Я начал писать метод resol для каждого класса перечисления, но должен быть лучший способ, чем дублировать один и тот же метод с инструкцией 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);
, но это должно быть сделано с как можно меньшим количеством кода. То есть можно ли все это просто обработать из базового класса, не добавляя дополнительный универсальный тип?