参考NET深入解析LINQ框架 C#的扩展方法解说
扩展方法就是允许在不修改类型的内部代码的情况下为类型添加独立的行为。 扩展方法的本意在于不修改对象内部代码的情况下对对象进行添加行为。这种方便性大大提高了我们对程序的扩展性,虽这小小的扩展性在代码上来看不微不足道,但是如果使用巧妙的话将发挥很大的作用。扩展方法对LINQ的支撑非常重要,很多对象原本构建与.NET2.0的框架上,LINQ是.NET3.0的技术,如何在不影响原有的对象情况下对对象进行添加行为很有挑战。 那么我们利用扩展方法就可以无缝的嵌入到之前的对象内部。这样的需求在做框架设计时很常见,最为典型的是我们编写了一个.NET2.0版本的DLL文件作为客户端程序使用,那么我们有需要在服务端中对.NET2.0版本中的DLL对象加以控制。比如传统的WINFORM框架,我们可以将ORM实体作为窗体的控件数据源,让ORM实体与窗体的控件之间形成自然的映射,包括对赋值、设置值都很方便。但是这样的实体经过序列化后到达服务层,然后经过检查进入到BLL层接着进入到DAL层,这个时候ORM框架需要使用该实体作相应的数据库操作。那么我们如何使用.NET3.0的特性为ORM添加其他的行为呢?如果没有扩展方法这里就很无赖了。有了扩展方法我们可以将扩展方法构建与.NET3.0DLL中,在添加对.NET2.0DLL的友元引用,再对ORM实体进行扩展。[王清培版权所有,转载请给出署名] 我们来看一个小例子,看看扩展方法如果使用; public class OrderCollection { public List list = new List(); } public class Order { public int Count; public string OrderName; public string OrderId; } 这里仅仅是为了演示,比较简单。我定义了一个Order类和一个OrderCollection类,目前看来OrderCollection没有任何的方法,下面我们通过添加一个扩展方法来为OrderCollection类添加一写计算方法,比如汇总、求和之类的。 如何定义扩展方法? 扩展方法必须是静态类中的静态方法,我们定义一个OrderCollection类的扩展方法Count。 public static class OrderExtend { public static int Count(this OrderCollection OrderCollectionObject) { return OrderCollectionObject.list.Count; } } 扩展方法的第一个参数必须是this 关键开头然后经跟要扩展的对象类型,然后是扩展对象在运行时的实例对象引用。如果没有实例对象的引用我想扩展方法也毫无意识。所以这里我们使用Count方法来汇总一共有多少Order对象。通过OrderCollectionObject对象引用我们就可以拿到实例化的OrderCollection对象。 OrderCollection orderCollection = new OrderCollection(); orderCollection.Count(); 还有一个需要大家注意的是,如果我们定义的扩展方法在另外的命名空间里,我们在使用的时候一定要在当前的CS代码中应用扩展方法所在的命名空间,要不然编辑器是不会去寻找你目前在使用的对象的扩展方法的,切忌。这里还有一点是需要我们注意的,当我们在设计后期可能会被扩展方法使用的对象时需要谨慎的考虑对象成员访问权限,如果我们将以后可能会被扩展方法使用的对象设计成受保护的或者私有的,那么可能会涉及到无法最大力度的控制。[王清培版权所有,转载请给出署名]
为数据类型的添加一个方法的理解:一般来说,int数据类型有个Tostring的方法,就是把int 数据转换为字符串的类型,比如现在我们想在转换成字符串的时候还添加一点东西,比如增加一个字符 a .那么之前的Tostring就不好使了,因为它只是它我们的int数据转换为string类型的,却并不能添加一个字母 a.所以这就要用到所谓的扩展方法了。
首先我们看一个给现有的类型增加一个扩展方法。
我们想给string 类型增加一个Add方法,该方法的作用是给字符串增加一个字母a.
//必须是静态类才可以添加扩展方法 Static class Program { static void Main(string[] args) { string str = "quzijing"; //注意调用扩展方法,必须用对象来调用 string Newstr = str.Add(); Console.WriteLine(Newstr); Console.ReadKey(); } //声明扩展方法 //扩展方法必须是静态的,Add有三个参数 //this 必须有,string表示我要扩展的类型,stringName表示对象名 //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,//再增加一个变量即可 public static string Add(this string stringName) { return stringName+"a"; } }我们再来尝试给我们自定义的类型增加一个扩展方法,并增加一个传递的参数。
首先我们声明一个Student类,它包含了两个方法StuInfo,getStuInfo.实例代码如下:
public class Student { public string StuInfo() { return "学生基本信息"; } public string getStuInfo(string stuName, string stuNum) { return string.Format("学生信息:\n" + "姓名:{0} \n" + "学号:{1}", stuName, stuNum); } }之后我们再声明一个名为ExtensionStudentInfo的静态类,注意必须为静态
这个类的作用就是包含一些我们想要扩展的方法,在此我们声明两个Student类型的扩展方法,Student类型为我们自定义的类型。示例代码如下:
public static class ExtensionStudentInfo { //声明扩展方法 //要扩展的方法必须是静态的方法,Add有三个参数 //this 必须有,string表示我要扩展的类型,stringName表示对象名 //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,再增加一个变量即可 public static string ExtensionStuInfo(this Student stuName) { return stuName.StuInfo(); } //声明扩展方法 //要扩展的方法必须是静态的方法,Add有三个参数 //this 必须有,string表示我要扩展的类型,stringName表示对象名 //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,在此我们增加了两个string类型的参数 public static string ExtensionGetStuInfo(this Student student, string stuname, string stunum) { return student.getStuInfo(stuname, stunum)+"\n读取完毕"; } }以上的工作做完之后便可以使用我们的扩展方法了,注意必须要用对象来调用扩展方法。
static void Main(string[] args) { Student newstudent = new Student(); //要使用对象调用我们的扩展方法 string stuinfo = newstudent.ExtensionStuInfo(); Console.WriteLine(stuinfo); //要使用对象调用我们的扩展方法 string stuinformation = newstudent.ExtensionGetStuInfo("quzijing", "20081766"); Console.WriteLine(stuinformation); Console.ReadKey(); }