There will be times when you can utilize generics, when you have a block of functionality that could apply to any or a large set of class types. Take List<T> for example. Anything can be a list, as a list is a very abstract construct. Therefore a list is a natural candidate for "genericizing".
However, consider a class that works with text parsing. The methods will always expect strings. So is there much sense in creating a class that uses generics when the type parameter for the generic will likely always be a string? That's just overkill.
Given that generics can be tricky to work with and understand, it is sensible to maintain functionality that applies to specific concrete types when appropriate. Doing so leads to more terse and readable code and decreased complexity.
Consider also that every data type is derived from System.Object. You could certainly declare every variable in your code as type 'object', but you would then require casting every time you needed to do something specific to the type instantiated (that is not inherited from System.Object). This is functional but not very user friendly.
Consider generics a specialized tool set that should be used where appropriate, but not as a replacement for existing tools.
-Peter
compiledthoughts.com