什么是扩展方法?
扩展方法顾名思义,就是允许向现有的“类型”添加方法,而无需创建派生类、重新编译或以其他方式修改原来类型。
扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
扩展方法和实例方法有何区别?
通常只有在不得已(例如:不能修改原来的类型)的情况下才实现扩展方法,如果扩展方法和类型中定义的实例方法相同,则扩展方法不会被调用,因为实例方法的优先级高于扩展方法的优先级。。
已用到的扩展方法:
最常见的扩展方法是LINQ标准查询运算符,它将查询功能添加到现有的System.Collections.IEnumerable和System.Collection.Generic.IEnumerable<T>类型。若要使用标准查询运算符,请先使用using System.Linq指令将它们置于范围内。然后,任何实现了IEnumerable<T>的类型看起来都具有GroupBy<TSource,TKey>,Order<TSource,TKey>等实例方法。
class ExtensionMethods2 { static void Main() { int[] ints = { 10, 45, 15, 39, 21, 26 }; var result = ints.OrderBy(g => g); foreach (var i in result) { System.Console.Write(i + " "); } } } //Output: 10 15 21 26 39 45
如何增加一个扩展方法?
一、定义一个测试类型,其中包含一个实例方法,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo_ExtensionMethod2 { public class Test { public void InstanceMethod() { Console.WriteLine("I am a Instance Method!"); } } }
二、定义一个扩展类型,其中包含一个扩展方法,以后如需新增扩展方法,在该类中新增方法放即可,主要要定义为static类型,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Demo_ExtensionMethod2.ExtensionMethods { public static class MyExtensions { public static void ExtensionMethod(this Test test) { Console.WriteLine("I am a Extension Method!"); } } }
三、使用时,切记要添加对扩展方法的引用,否则编译不过,如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Demo_ExtensionMethod2.ExtensionMethods; namespace Demo_ExtensionMethod2 { class Program { static void Main(string[] args) { Test test = new Test(); test.InstanceMethod(); //调用实例方法 test.ExtensionMethod(); //调用扩展方法 Console.Read(); } } }