Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| // Define an interface named IMyInterface. | |
| namespace DefineIMyInterface | |
| { | |
| using System; | |
| public interface IMyInterface | |
| { | |
| // Any class that implements IMyInterface must define a method | |
| // that matches the following signature. | |
| void MethodB(); | |
| } | |
| } | |
| // Define extension methods for IMyInterface. | |
| namespace Extensions | |
| { | |
| using System; | |
| using DefineIMyInterface; | |
| // The following extension methods can be accessed by instances of any | |
| // class that implements IMyInterface. | |
| public static class Extension | |
| { | |
| public static void MethodA(this IMyInterface myInterface, int i) | |
| { | |
| Console.WriteLine | |
| ("Extension.MethodA(this IMyInterface myInterface, int i)"); | |
| } | |
| public static void MethodA(this IMyInterface myInterface, string s) | |
| { | |
| Console.WriteLine | |
| ("Extension.MethodA(this IMyInterface myInterface, string s)"); | |
| } | |
| // This method is never called in ExtensionMethodsDemo1, because each | |
| // of the three classes A, B, and C implements a method named MethodB | |
| // that has a matching signature. | |
| public static void MethodB(this IMyInterface myInterface) | |
| { | |
| Console.WriteLine | |
| ("Extension.MethodB(this IMyInterface myInterface)"); | |
| } | |
| } | |
| } | |
| // Define three classes that implement IMyInterface, and then use them to test | |
| // the extension methods. | |
| namespace ExtensionMethodsDemo1 | |
| { | |
| using System; | |
| using Extensions; | |
| using DefineIMyInterface; | |
| class A : IMyInterface | |
| { | |
| public void MethodB() { Console.WriteLine("A.MethodB()"); } | |
| } | |
| class B : IMyInterface | |
| { | |
| public void MethodB() { Console.WriteLine("B.MethodB()"); } | |
| public void MethodA(int i) { Console.WriteLine("B.MethodA(int i)"); } | |
| } | |
| class C : IMyInterface | |
| { | |
| public void MethodB() { Console.WriteLine("C.MethodB()"); } | |
| public void MethodA(object obj) | |
| { | |
| Console.WriteLine("C.MethodA(object obj)"); | |
| } | |
| } | |
| class ExtMethodDemo | |
| { | |
| static void Main(string[] args) | |
| { | |
| // Declare an instance of class A, class B, and class C. | |
| A a = new A(); | |
| B b = new B(); | |
| C c = new C(); | |
| // For a, b, and c, call the following methods: | |
| // -- MethodA with an int argument | |
| // -- MethodA with a string argument | |
| // -- MethodB with no argument. | |
| // A contains no MethodA, so each call to MethodA resolves to | |
| // the extension method that has a matching signature. | |
| a.MethodA(1); // Extension.MethodA(object, int) | |
| a.MethodA("hello"); // Extension.MethodA(object, string) | |
| // A has a method that matches the signature of the following call | |
| // to MethodB. | |
| a.MethodB(); // A.MethodB() | |
| // B has methods that match the signatures of the following | |
| // method calls. | |
| b.MethodA(1); // B.MethodA(int) | |
| b.MethodB(); // B.MethodB() | |
| // B has no matching method for the following call, but | |
| // class Extension does. | |
| b.MethodA("hello"); // Extension.MethodA(object, string) | |
| // C contains an instance method that matches each of the following | |
| // method calls. | |
| c.MethodA(1); // C.MethodA(object) | |
| c.MethodA("hello"); // C.MethodA(object) | |
| c.MethodB(); // C.MethodB() | |
| } | |
| } | |
| } | |
| /* Output: | |
| Extension.MethodA(this IMyInterface myInterface, int i) | |
| Extension.MethodA(this IMyInterface myInterface, string s) | |
| A.MethodB() | |
| B.MethodA(int i) | |
| B.MethodB() | |
| Extension.MethodA(this IMyInterface myInterface, string s) | |
| C.MethodA(object obj) | |
| C.MethodA(object obj) | |
| C.MethodB() | |
| */ |