Every .NET developer loves Reflector, since it gives us a chance to see inside assemblies that we don’t have the source for. And I’ve even read bloggers showing off the code that has been reverse engineered by it as evidence of poor coding practices at some organisation or another (“look, these guys use gotos!”). But though Reflector is a brilliant tool, its reverse engineering skills are not perfect. See this fairly innocent looking switch statement from some code I’m working on
switch(type) { case "gateway": SetValue(component, "@type", "decision", true); string xml = component.InnerXml; xml = xml.Replace("gateway", "decision"); component.InnerXml = xml; break; case "deliverable": case "dataObject": SetValue(component, "@type", "document", true); break; case "annotation": SetValue(component, "@type", "note", true); break; }
And this is what Reflector shows from the compiled assembly
if (CS$4$0001 != null) { if (!(CS$4$0001 == "gateway")) { if ((CS$4$0001 == "deliverable") || (CS$4$0001 == "dataObject")) { goto Label_00B0; } if (CS$4$0001 == "annotation") { goto Label_00C5; } } else { this.SetValue(component, "@type", "decision", true); string xml = component.InnerXml.Replace("gateway", "decision"); component.InnerXml = xml; } } goto Label_00DA; Label_00B0: this.SetValue(component, "@type", "document", true); goto Label_00DA; Label_00C5: this.SetValue(component, "@type", "note", true); Label_00DA:;
Which I think proves my point…