This is a somewhat simplified example (I changed it around to hide the actual code). I have a database-powered app and a small tool that is being developed separately that is meant to work with the app. There is a table that defines an enumeration, but it could potentially change over time. Suppose some app (medical?) needed to track the sex of a person rather precisely.
select * from sex order by id;
id | mnemonic | description
0  | U        | Unknown sex
1  | M        | Male
2  | F        | Female
3  | T        | Trans-gender
And my C# enum:
public enum SexType
{
    /// <summary>Unknown sex.</summary>
    [Description("U")]
    Unknown = 0,
    /// <summary>Male sex.</summary>
    [Description("M")]
    Male = 1,
    /// <summary>Female sex.</summary>
    [Description("F")]
    Female = 2
    /// <summary>Trans-gender sex.</summary>
    [Description("T")]
    TransGender = 3,
}
Here I should not assume that the id is a continuous sequence; neither are these enums flags that can be combined, even though it might look that way.
Some of the logic is done in SQL; some is done in C# code. For instance, I might have a function:
// Here we get id for some record from the database.
public static void IsMaleOrFemale(int sexId)
{
    if (!Enum.IsDefined(typeof(SexType), sexId))
    {
        string message = String.Format("There is no sex type with id {0}.", 
            sexId);
        throw new ArgumentException(message, "sexId");
    }
    var sexType = (SexType) sexId;
    return sexType == SexType.Male || sexType == SexType.Female;
}
This can work fairly well as long as neither the table nor the enum definitions change. But the table might. I cannot rely on the id column or the mnemonic column maintaining their values. I think the best I can to is have a unit test which makes sure that the table is in sync with my definition of an enum. I am trying to match the value to id, and the description attribute to mnemonic column.
So, how to I get a list of all pairs (programmatically, in C#): (0, "U"), (1, "M"), (2, "F"), (3, "T") by looking at the enum SexType?
The idea is to tightly compare this ordered list with select id, mnemonic from sex order by is asc;.
Why not change SexType from an enum to a class (or Struct) and populate a List from your database at runtime?
Your struct (or class) would look something like this:
public struct SexType
{
  public string Type;
  public string Code;
  public int Value;
}
Then you could populate from your database a List<SexType> (or, if you're using EF, you could pull down a list of Entities of type SexType, or whatever your solution allows).
Presuming you're using Linq and EF, do eager loading when the application starts, and you should be good-to-go.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With