I’ve run into this issue quite a few times and never liked the solution chosen. Let’s say you have a list of States (just as a simple example) in the database. In your code-behind, you want to be able to reference a State by ID and have the list of them available via Intellisense.
For example:
States.Arizona.Id //returns a GUID
But the problem is that I don’t want to hard-code the GUIDS. Now in the past I’ve done all of the following:
-
Create class constants (hard-coding of the worst kind.. ugh!)
-
Create Lookup classes that have an ID property (among others) (still hard-coded and would require a rebuild of the project if ever updated)
-
Put all the GUIDS into the .config file, create an enumeration, and within a static constructor load the GUIDS from the .config into a Hashtable with the enumeration item as the key. So then I can do:
StateHash[StatEnum.Arizona]. Nice, because if a GUID changes, no rebuild required. However, doesn’t help if a new record is added or an old one removed, because the enumeration will need to be updated.
So what I’m asking is if someone has a better solution? Ideally, I’d want to be able to look up via Intellisense and not have to rebuild code when there’s an update. Not even sure that’s possible.
EDIT: Using states was just an example (probably a bad one). It could be a list of widgets, car types, etc. if that helps.
I believe that if it shows up in Intellisense, then, by definition, it is hard-coded into your program.
That said, if your goal is make the hard-coding as painless as possible, on thing you might try is auto-generating your enumeration based on what’s in the database. That is, you can write a program that reads the database and creates a FOO.cs file containing your enumeration. Then just run that program every time the data changes.