扩展方法 Extension Method.
这个可以用在,比方有一个密封类,你不能修改它,但你又想对它继承或者扩展,这个时候就可以用到扩展方法了。
举个例子:
class Program
{
static void Main(string[] args)
{
SealedClass x = new SealedClass();
Console.WriteLine(x.TestMethod());
}
}
sealed class SealedClass
{
}
static class SealedClassExtension
{
public static string TestMethod(this SealedClass x)
{
return "";
}
}
在上面的例子中,可以看出,要定义方法,需要做以下几件事:
(1) 定义个扩展类;这个类必须是静态类,static的
(2) 定义扩展方法;这个方法也必须是静态的
(3) 该扩展方法的语法比较奇怪,第一个参数是被扩展的类,而且前边必须用个this关键字
下面再举一个例子。
我们经常使用到执行了IEnumerable<T>的容器,比如说List<T>。这些容器因为执行了IEnumerable<T>接口,所以都能使用一些方法,比如Aggregate。
如果去看IEnumerable<T>接口的定义,并没有包含Aggregate方法,所以Aggregate实际是一个扩展方法。
它是在静态类Enumerable中定义的。下面看一下,当然没有完全列出Enumerable类中所有的成员。
public static class Enumerable
{
public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);
public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);
}
上面实际的例子中可以看出,不仅可以对类进行扩展,对接口也可以进行扩展。