The “Delegate Dictionary” Pattern
When you see code like this:
private void ThisCodeReallySux(string action_)
{
if (action_ == "Action1")
DoAction1();
else if (action_ == "Action2")
DoAction2();
else if (action_ == "Action3")
DoAction3();
else if (action_ == "Action4")
DoAction4();
else if (action_ == "Action5")
DoAction5();
else if (action_ == "Action6")
DoAction6();
else if (action_ == "Action7")
DoAction7();
else if (action_ == "Action8")
DoAction8();
else if (action_ == "Action9")
DoAction9();
else if (action_ == "Action10")
DoAction10();
}
Replace it with a “delegate dictionary” and a method that loads the dictionary when an instance of the class is instantiated.
private readonly Dictionary _actionMap
= new Dictionary();
// LoadActionMap should be called from the class' constructor.
private void LoadActionMap()
{
_actionMap["Action1"] = DoAction1;
_actionMap["Action2"] = DoAction2;
_actionMap["Action3"] = DoAction3;
_actionMap["Action4"] = DoAction4;
_actionMap["Action5"] = DoAction5;
_actionMap["Action6"] = DoAction6;
_actionMap["Action7"] = DoAction7;
_actionMap["Action8"] = DoAction8;
_actionMap["Action9"] = DoAction9;
_actionMap["Action10"] = DoAction10;
}
Instead of having all the IF/ELSE code, you simply have two lines of code… no matter how many “actions” you have. Of course, in this example, there is no logging or reporting of the case when an unknown action arises… but this is example code!
private void ThisCodeIsMuchBetter(string action_)
{
if (_actionMap.ContainsKey(action_))
_actionMap[action_]();
}

This is one of my favorite patterns. Create the dictionary once instead of creating it everytime you invoke a switch statement. Very nice.