I quickly ran into an issue where extension methods only work with the same class that the object is cast to. Say for example you have a Shape superclass and Circle subclass. Normally we would pass around Circle objects as Shapes and rely on virtual or abstract methods to provide a common interface. With extension methods there is no inheritance so you have to either explicitly cast our objects or do some type of switching in a common method.
I've created a simple program in LINQPad to demonstrate this behavior:
void Main() { // Create a new Circle but cast it as a Shape Shape obj = new Circle(); // Call the virtual method Console.WriteLine(obj.WhoAmI()); // Call the extension method Console.WriteLine(obj.WhoAmIEx()); } public class Shape { public virtual string WhoAmI() { return "Virtual Shape"; } } public class Circle : Shape { public override string WhoAmI() { return "Overriden Circle"; } } public static class Extensions { public static string WhoAmIEx(this Shape obj) { return "Shape Extension"; } public static string WhoAmIEx(this Circle obj) { return "Circle Extension"; } }
Running this produces:
Overriden Circle Shape Extension
Took me a little while to figure out this behavior (although I should have realized it from the start). I still ended up using an extension method to add one new call but after we merge the code I think I will change that back to a virtual method.