C#中可以定义​扩展方法​,还可以​为集合做扩展方法​。

示例如下:

C# 扩展方法[学习]_C#C# 扩展方法[学习]_c#_02扩展方法 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。


参考来源:

C#进阶 Methods下 Extension Methods

不能不说的C# 特性-扩展方法

C# 扩展方法奇思妙用