代码改变世界

C# 3.0 新特性----扩展方法

2010-04-08 11:52  jiejiep  阅读(446)  评论(0编辑  收藏  举报
  1. 主要目的
    掌握对一个已经编译的类的方法的扩展
  2. 特别注意
    a. 扩展某个类时,新建的类要使用 public static 修饰,因为默认的类是 internal 访问修饰符
    b. 这个类要有文件作用域,即不能作为嵌套类使用
    c. 扩展方法要声明为静态的
    d. 扩展方法的第一个参数类型即是要扩展的类,且该参数前要加 this 关键字
    e. 扩展类的命名很重要,当NET Framework 类库更新时,若更新后的类库中,添加了与你先前自定义的静态扩展类相同的类名,则会隐藏掉自定义的静态扩展类
    f.  为类型A添加扩展方法时,同时也会为类型A的派生类添加该扩展方法,故尽量不要在基类上添加扩展方法,以免造成方法冗余。
  3. 具体实现
    如下代码实现添加一个扩展 object 类的方法,因为 .net 中所有的类都继承自 object 类,故调用时,随意选择了 int 类型
    代码如下:

    代码
    1 publicstaticclass ExtendObject
    2 {
    3 publicstaticvoid ShowTypeInfo(thisobject obj)
    4 {
    5 Console.WriteLine("my datatype is {0}", obj.GetType().Name);
    6 }
    7 }

    调用时的代码如下:
    可以有两种调用方法:一是实例调用,二是扩展类名调用

    代码
    1 class Program
    2 {
    3 staticvoid Main(string[] args)
    4 {
    5 int a =192;
    6 //使用类实例调用静态方法
    7   a.ShowTypeInfo();
    8
    9 //使用静态类名调用静态方法
    10   ExtendObject.ShowTypeInfo(a);
    11 Console.Read();
    12 }
    13 }
     
  4. 现在,我们来分析一下,当编译器碰到代码 a.ShowTypeInfo() 时都做了哪些事:

    首先,它会去检查 System.Int32类中是否有ShowTypeInfo方法的定义,如果有,则调用,如果没有,编译器则会去寻找所有静态类,看是否哪个静态类中有静态方法的第一个参数是Int32类型或者它的基类,并且有 this 关键字修饰。有则调用,无则会报错。

  5. 特别需要注意的是,扩展类与被扩展的类是两个不同的类,故扩展类中的类方法访问被扩展类的成员时,只能访问声明为 public 修饰符的成员。

    代码如下:

    被扩展的类:Bird

  6. class Bird
    {
        
    private string _bType;
        
    public string BType
         {
             
    get;
             
    set;
         }
    }


    扩展类 ExtendBird

    1 public static class ExtendBird
    2 {
    3     public static void SetBirdType(this Bird b, string birdType)
    4     {
    5         //公共属性,可以访问
    6          b.BType = birdType;
    7
    8         //会出现编译错误
    9          _bType = birdType;
    10     }
    11 }