public static class LooseMethods { public static void PrintOn(this Object obj, TextWriter writer) { writer.WriteLine("Default"); } public static void PrintOn(this DateTime obj, TextWriter writer) { writer.WriteLine("DateTime: {0}", obj); } public static void PrintOn(this int obj, TextWriter writer) { writer.WriteLine("Integer: {0}", obj); } public static void PrintOn(this String obj, TextWriter writer) { writer.WriteLine("String: {0}", obj); } } public class Printer { void Print(Object obj) { obj.PrintOn(Console.Out); } } public class GenericPrinter { void Print(T obj) { obj.PrintOn(Console.Out); } } public class Program { static void main() { exampleOne(); exampleTwo(); } static void exampleOne() { Printer p1 = new Printer(); p1.Print(1); p1.Print(1f); p1.Print("Hello"); p1.Print(DateTime.Now); } static void exampleTwo() { GenericPrinter p2 = new GenericPrinter(); p2.Print(1); p2.Print(1f); p2.Print("Hello"); p2.Print(DateTime.Now); } }