How Interfaces, Generics and Extension Methods Can Make Code Cleaner