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
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
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.