C# 扩展方法
假设该类是密封的,不能访问代码,或有其他的设计原因使这些方法不能工作,就不得不在另一个类中使用该类的公有可用成员编写一个方法。
假设这个类是密封的:
sealed class MyData{double D1;double D2;double D3;public MyData(double d1,double d2,double d3){ D1 = d1;D2 = d2; D3 = d3; }public double Sum(){return D1 + D2 + D3; ; ;}}
上述类中计算了三个数的和,假如我们需要计算三个数的平均值:
那就需要重新写一个类如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WFM_Thread
{public partial class Form9 : Form{public Form9(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){MyData myData = new MyData(3, 4, 5);double average = ExtendMyData.Average(myData);Console.WriteLine("平均值为:{0}", average);}}static class ExtendMyData{public static double Average(MyData md){return md.Sum() / 3;}}
}
注意看上述的代码使用的是 ExtendMyData.Average(myData),但如果能在类的实例自身上调用该方法,而不是创建另一个作用于它的类的示例,将会更优雅。
ExtendMyData.Average(myData)//静态调用形式myData.Average();//实例调用形式
下面将类ExtendMyData改编成为类MyData的扩展方法:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WFM_Thread
{public partial class Form9 : Form{public Form9(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){MyData myData = new MyData(3, 4, 5);double average = myData.Average();Console.WriteLine("平均值为:{0}", average);}}static class ExtendMyData{public static double Average(this MyData md){return md.Sum() / 3;}}
}
扩展方法的重要要求如下:
声明扩展方法的类必须声明为static;
扩展方法本身必须声明为static;
扩展方法必须包含关键字this作为它的第一个参数类型,并在后面跟着它所扩展的类的名称。