Какой правильный способ получения моих пользовательских классов перечисления по их значению?

Я создал свои собственные псевдо перечисления в моей доменной модели, чтобы позволить мне иметь более подробные значения. Например, мой класс выглядит следующим образом:

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

Ответы на вопрос(2)

Ваш ответ на вопрос