To wieloznacze. Mozesz podasz szerzej?
Mogę. Jeżeli potrzebujesz konkretnych wartości, możesz tak skonstruować klasę, że będzie zachowywała się podobnie do enum
. Np.:
public class Foo
{
public string Code { get; }
public string Description { get; }
public int Value { get; }
private Foo(string code, string description, int value) //prywatny konstruktor uniemożliwi tworzenie nowych instancji
{
this.Code = code;
this.Description = description;
this.Value = value;
}
public static Foo First { get; } = new Foo("A", "Pierwszy", 0);
public static Foo Second { get; } = new Foo("B", "Drugi", 1);
public static Foo ConvertFrom(string foo)
{
if (foo == First.Code)
return First;
...
//można to pewnie ładniej zrobić; można też pewnie przeładować operator rzutowania dla string/enum itd.
}
}
Mamy teraz znacznie więcej możliwości. Wadą tego rozwiązania jest jednak to, że nie możemy korzystać z tego tam, gdzie wymagana jest stała (np. atrybuty). I oczywiście jeśli mamy już kilkaset razy użyty ten enum
, to też zabawa średnia - jednak wtedy możemy zacząć używać tej klasy i stopniowo refaktoryzować.
Nawet jeśli wyciągasz to z bazy, to możesz zrobić rzutowanie na ten typ Foo
, jeśli przeładujesz operator.