关于C#扩展方法介绍
2012-08-15 14:11
1021 查看
扩展方法 Extension Method.
这个可以用在,比方有一个密封类,你不能修改它,但你又想对它继承或者扩展,这个时候就可以用到扩展方法了。
举个例子:
Csharp代码
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类中所有的成员。
Csharp代码
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);
}
上面实际的例子中可以看出,不仅可以对类进行扩展,对接口也可以进行扩展。
这个可以用在,比方有一个密封类,你不能修改它,但你又想对它继承或者扩展,这个时候就可以用到扩展方法了。
举个例子:
Csharp代码
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类中所有的成员。
Csharp代码
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);
}
上面实际的例子中可以看出,不仅可以对类进行扩展,对接口也可以进行扩展。
相关文章推荐
- 19.C#逐一介绍IEnumerable和IEnumerable<T>中的扩展方法(10.3-10.5)
- 关于C#扩展方法
- 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决
- 关于C#中this的一个用法----用于C#原始类型扩展方法
- 关于unity使用dll和c#扩展方法的小结
- C#关于Clone()方法的介绍
- 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决
- C#关于类的定义及方法介绍
- net 3.5中关于var、初始化、匿名类和扩展方法介绍
- C#下的单例实现本文介绍了C#下关于单例的三种实现方法。 最普通的一种: 以下是引用片段: using System; public class Singleton { pr
- 关于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法
- 关于C#扩展方法
- 关于在 C#中无法静态库引用的解决方法
- firefox扩展插件制作方法详细介绍
- c# 扩展方法奇思妙用基础篇九:Expression 扩展
- C#调用Java代码的方法介绍
- C# 关于判断字符串为空的一些方法
- jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
- 关于U盘使用最安全方法介绍
- c#关于委托和事件(二)(介绍的很详细)