扩展方法的就是在一个已经写好的类上添加一个方法,然后可以直接在这个类对象上调用这个方法。但有以下特性:
1、扩展方法是给现有类型添加一个方法;
2、扩展方法是通过指定关键字 this 修饰方法的第一个参数来标志的;
3、扩展方法必须声明在静态类中;
4、扩展方法要通用对象来调用;
5、扩展方法可以带参数。
// 必须建一个静态类,用来包含要添加的扩展方法 static class TestExtensionMethod { //要添加的扩展方法必须为一个静态方法 //此方法参数列表必须以this开始 第二个即为要扩展的数据类型,在这里就是要扩展string类型 //第三个就无所谓了,就是一对象名,名字随便,符合命名规则即可 //综合来讲,此方法就是要给string类型添加一个叫TestMethod的方法, //此方法返回一个int型的值,即返回调用此方法对象的长度。 public static int TestMethod(this string s) { return s.Length; } } //测试扩展方法类 class Program1 { public void Main() { string str = "Hello Extension Methods"; //调用扩展方法,必须用对象来调用 int len = str.TestMethod(); Console.WriteLine(len);
// string.TestMethod(); 这种方式也是不能调用的
} }
|
这个特性有点意思吧。在一个静态类里写一个静态方法,然后在第一个参数类型前加个 this 关键字,那它就变成了这个参数类型这个类对象的扩展方法。还有,这个扩展方法是没办法再根据方法名调用了,只能由参数类型对象的实例来调用,也不能用类名加方法名调用。这个就像是给这个类的所有实例加了一个工具方法,这个方法只能访问实例本身,但并不能访问实例的私有成员和方法。
不知道你注意到没有,在调用 TestMethod 时,扩展函数的参数没有了。当然,也可以给扩展方法加参数,如下:
public class Student { public string Description() { return "Student............."; } public string Description(string name) { return "the student’s name is " + name; } } // 必须建一个静态类,用来包含要添加的扩展方法 public static class Extensions { //要添加的扩展方法必须为一个静态方法 //此方法参数列表必须以this开始 第二个即为要扩展的数据类型,在这里就是要扩展Student类型 //第三个就无所谓了,就是一对象名,名字随便,符合命名规则即可 //综合来讲,此方法就是要给Student类型添加一个叫TestMethod的方法,此方法返回一个string型的值 public static string TestMethod(this Student s) { return s.Description(); } //要添加的扩展方法必须为一个静态方法 //此方法参数列表第一个参数表示要扩展哪一个类,第二个参数才表示此扩展方法的真正参数 //综合来讲,此方法就是要给Student类型添加一个叫TestMethod的方法, //此方法带有一个string类型的参数,并返回一个string型的值 public static string TestMethod(this Student s, string name) { return s.Description(name); } } //测试扩展方法类 class Program2 : IEntryPoint { public void EntryPoint() { Student stu = new Student(); //调用扩展方法,必须用对象来调用 string mes = stu.TestMethod(); Console.WriteLine(mes); //调用带参数的扩展方法,只要传第二个参数就可以了 //因为他的第一个参数其实只是为了表明是扩展哪个数据类型 mes = stu.TestMethod("我测试"); Console.WriteLine(mes); } }
|
这样,当你调用时,就有了参数了,但还是比你写的方法的参数少了一个,也就是第一个。
如果你要在别的命名空间中用你的扩展方法,那你只需要 using 一下这个包就行了。
扩展方法有很多好处,推荐你在每个扩展方法上写好文档注释,这样别人在使用时才知道你的方法实现了什么功能。要不,别人一看 string 方法上有个 TestMethod 方法,又不知道怎么用,所以只好去 MSDN 查一下了。
阅读(1433) | 评论(0) | 转发(0) |