首页 > 代码库 > study Mvc step by step (三)C#语言特性扩展方法

study Mvc step by step (三)C#语言特性扩展方法

  C#3.0之后推出了扩展方法。我们通常看到的方法都是和声明它的类相关联。扩展方法特性扩展这个边界,允许编写的方法和声明它的类之外的类关联。

要想知道可以如何使用这个特性,请看下面的代码。它包含类MyPerson.该类存贮了3个double类型的值,并含有一个构造函数和一个名称为sum的方法,该方法返回3个存储值得和。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 河南云和数据{    class MyPerson    {        private double p1;        private double p2;        private double p3;        public MyPerson(double p1, double p2, double p3)        {            this.p1 = p1;            this.p2 = p2;            this.p3 = p3;        }        public double Sum()        {            return p1 + p2 + p3;        }    }}

这是一个非常有限的类,但假如它还含有另外一个方法会更有用,该方法返回 3个数据的平均值。使用已经了解的关于类的内容。还有几种方法可以实现这个额外的功能。
1:如果你有源代码并可以修改这个类,当然你需要为这个类添加一个新方法。然而,如果不能修改这个类(如这个类在一个第三方类库中),那么只要它不是密封类的,你就能把它用作一个基类并在派生自它的类中实现这个额外的方法。

然而,如果不能访问代码,并且该类是密封的,或有其他的设计原因使这些方法不能工作,就不得不再另一个类中使用该类的公有可用成员编写一个方法。

例如,可以编写下面这样得类。下面的代码包含一个名称为ExtendMyPerson的静态类,它含有一个名称为average的静态方法,该方法实现了额外功能。注意该方法是接受mypersondata的实例作为参数。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 河南云和数据{   static class ExtendMyData    {       public static double Average(MyPerson p)       {           return p.Sum() / 3;        }    }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 河南云和数据{    class Program    {        static void Main(string[] args)        {            MyPerson person = new MyPerson(3,4,5);            Console.WriteLine("Average:{0}",ExtendMyData.Average(person));            Console.ReadKey();        }    }}

尽管这是非常好的解决方案,但如果能在类的实例自身上调用该方法,而不是创建另一个作用于它的类的实例。将会更优雅。下面两行代码阐明了他们的区别。第一种使用刚显示的方法:在另一个类中的实例上调用静态方法。第二种展示了我们愿意使用的方式:在自身对象上调用实例方法。

扩展方法允许你使用第二种形式,即使第一种形式可能编写这种调用的正常方式。

通过对方法average的声明做一个小小的改动,就可以使用实例调用形式。需要做的修改是在参数声明中的类型名称加上关键字this,如下面所示。把this关键字加到静态类的静态方法的第一个参数上,把该方法从类ExendMyPersonData的常规方法改变成类MyPersonData的扩展方法。现在变成了.

 static class ExtendMyData    {       public static double Average(this MyPerson p)       {           return p.Sum() / 3;        }    }

扩展方法的重要要求如下

声明扩展方法的类必须是static

扩展方法本身必须声明static

扩展方法必须包含关键字this作为它的第一个参数,并在后面跟着他所扩展的类的名称