Introduction

As you know, enum is used to define a static set of values to use in different kinds of situations. Often enums define a single, self-explanatory set of values, but sometimes the same values may be needed in different contexts; Overlapping partially or none at all.

This tip describes how to use a master set of values to define context specific enums.

A simple enum

Let's take animals as an example. You can buy a pet and you can go to zoo to see different kinds of animals. Depending on the logic, you may need a different set of animals in your code, but you need to ensure that they all are unique in the sense of enum definition. So regardless of the context, dog would always be 1 and cat always 2 and so on.

Both of the methods accept a certain set of animals, but the possible animals are different based on the context. You see different animals in the zoo compared to what you buy as a pet. However, you can always tell which kind of animal is in question.

An example of using these context specific enums:

BuyAPet(Pet.Dog);
SeeAnAnimal(ZooAnimal.Bird);

Running the above example would give an output like:

You bought a Dog
You saw Bird

Using master enum with flags

Using a flagged enum is no different. Let's take another kind of example with different kinds of materials. You use partly different materials when building a house or making a furniture, but some of the material types are overlapping.

You have following common materials in your house and furniture:
- Wood

Conclusions

As you can see, using a single, predefined set of enum values can help to keep a single, uniquelly defined set of values and using subsets of this master enum helps to define context specific sets from the master list of values.

The download contains a small test project for the examples included in this tip.

While you can define a subset from a single enum as seen in this example, you can also define an enum combining several different enums. But that's another story

Share

About the Author

I've been a programmer since mid 80's using languages like assembler, C/C++, PL/I (mainframe environment), pascal, VB (I know, I know, no comments please) and C# and utilizing different techniques and tools.

However I'm specialized in databases and database modeling. Mostly I have used products like Oracle (from version 6), SQL Server (from version 4.2), DB2 and Solid Server (nowadays an IBM product).

For the past 10+ years my main concerns have been dealing with different business processes and how to create software to implement and improve them. At my spare time (what ever that actually means) I'm also teaching and consulting on different areas of database management, development and database oriented software design.