一,什么是扩展方法?
1,扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
2,扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
3,扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using
指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。
4,扩展方法在非嵌套的、非泛型静态类内部定义的
5,在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。
6,扩展方法是静态方法,则也不能被重写
Extension类
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Extensions{ //public static class Extension//提示扩展方法必须在非泛型静态类中定义 public static class Extension { public static void MethodStr(this string i) { Console.WriteLine(i); } }}
DefineIMyInterface接口
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DefineIMyInterface{ public interface IMyInterface { void MethodStr(); }}
Program调用实现:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Extensions;using DefineIMyInterface;namespace ExtenMethod{ class Test : IMyInterface { public void MethodStr() { Console.WriteLine("接口实现"); } } class Test2 { public void MethodStr() { Console.WriteLine("类的实现方法"); } }class Program { private string pri = "2"; static void Main(string[] args) { //在编译后,相同签名的方法,扩展方法的优先级总是比类型本身中定义的实例方法低,则实现的是接口和类的方法, //以下两个例子中:与接口或类方法具有相同名称和签名的扩展方法永远不会被调用,因为它的名称和签名与这些类已经实现的方法完全匹配。 //可以使用扩展方法来扩展类或接口,但不能重写扩展方法。 Test t = new Test(); t.MethodStr(); Test2 t2 = new Test2(); t2.MethodStr(); //实现扩展方法 string extenmethod = "扩展方法实现"; extenmethod.MethodStr(); //扩展方法无法访问它们所扩展的类型中的私有变量。 //在代码中,可以使用实例方法语法调用该扩展方法。但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。因此,并未真正违反封装原则。 //pri.MethodStr(); //报错 } }}