Joe Buschmann

let topics = [csharp; specflow; fun]

Overusing Generics in .NET

Generic types were a great addition to C# 2.0, but they are occasionally overused. There are times where calling object.GetType() or passing the type as an argument are sufficient.

A good example can be found in the Specflow source code. The TechTalk.SpecFlow.Assist.InstanceComparisonExtensionMethods class contains a useful extension method CompareToInstance<T>() which takes a table of expected property values and compares them against an object.

The generic type is completely unnecessary in this case. T is used as the type of the instance argument, but it is redundant since the runtime type can be found by invoking Object.GetType().

With this in mind, the method can be refactored to a non-generic version without sacrificing any function. The type of the instance argument changes to object, and typeof(T) on line 5 becomes instance.GetType(). The private generic methods in the class can be refactored similarly. The result is code that is simpler and more straightforward.