Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1935866
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类:

2009-02-23 16:27:29

扩展方法的就是在一个已经写好的类上添加一个方法,然后可以直接在这个类对象上调用这个方法。但有以下特性:
  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 查一下了。

阅读(1425) | 评论(0) | 转发(0) |
0

上一篇:C# 方法覆盖

下一篇:C# 的计时类 Stopwatch

给主人留下些什么吧!~~