C#中可以定义 扩展方法,还可以 为集合做扩展方法。
示例如下:
扩展方法
using System; using System.Collections.Generic; using MySpace; // 注意:引入扩展方法的空间 namespace Con_1 { class Program { static void Main( string[] args) { string str = " {0}先生。 ".With( " XuGang "); Console.WriteLine( " 您好! " + str); // 2调用集合的扩展方法 str.ShowItems< char>(); } } } namespace MySpace { // 扩展方法必须在非泛型静态类中定义 public static class MyMethods { // 注意:第一个参数使用“this”获得当前对象 public static string With( this string _context, params string[] _args) { return string.Format(_context,_args); } // 2为集合做扩展方法 public static void ShowItems<T>( this IEnumerable<T> _al) { foreach (var item in _al) { Console.WriteLine(item); } } } }
注意:
1 C# 只支持扩展方法,不支持扩展属性、扩展事件等;
2 方法名无限制,第一个参数必须带 this ;
3 扩展方法的命名空间可以使用 namespace System ,但不推荐;
4 定义扩展方法的类是静态类;
在使用this 参数扩展了方法之后,该程序集会在编译的时候会在对应静态类上加上类似以下的东西。以便于调用的时候方便找到。
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)] public sealed class ExtensionAttribute : Attribute { ...... }
MSIL 中,自动添加了如下的代码:
.custom instance void [System.Core]System.Runtime.CompilerServices.ExtensionAttribute::.ctor() = ( 01 00 00 00 )
可以看出,在运行时是需要引用 System.Core.dll。
参考来源:
本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2010/12/29/1920502.html,如需转载请自行联系原作者