C# - 扩展方法 Extension Method

扩展方法,顾名思义,是原有的对象附加一个新的方法。 扩展方法允许您在不修改、派生或重新编译原始类、结构或接口的情况下注入额外的方法。 可以将扩展方法添加到您自己的自定义类、.NET 框架类或第三方类或接口。 在以下示例中,Max 是 IEnumerable 类型的扩展方法,这个方法分返回这个集合的最大数

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var list = new List<int> { 2, 3, 4 };
            var max = list.Max();
            Console.WriteLine(max);
        }
    }
}

要使用这个方法必须添加命名空间引用 using System.Linq;

扩展方法在visual studio的intellisense中有一个特殊的符号,这样你就可以轻松区分类方法和扩展方法。

自己写一个扩展方法

例如,在以下示例中,我们在 Malema.net 命名空间下创建了一个 IntExtensions 类。 IntExtensions 类将包含适用于 int 数据类型的所有扩展方法。 (您可以为命名空间和类使用任何名称。有时候我们会命名成我们项目当中都要用到的名字,这样就不需要在每个类里在引用一次命名空间)

namespace Malema.Extensions
{
    public static class IntExtensions
    {

    }
}

现在,将静态方法定义为扩展方法,其中扩展方法的第一个参数指定扩展方法所适用的类型。 我们将在 int 类型上使用这个扩展方法。 所以第一个参数必须在 int 前面加上 this 修饰符。

例如,IsGreaterThan() 方法对 int 进行操作,因此第一个参数将是 this int i。

namespace Malema.Extensions
{
    public static class IntExtensions
    {
        public static bool IsGreaterThan(this int i, int value)
        {
            return i > value;
        }
    }
}

现在,您可以在要使用此扩展方法的地方 引用 Malema.Extensions 命名空间。

using System;
using Malema.Extensions; //引用命名空间

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var i = 10;
            var result = i.IsGreaterThan(100);
            Console.WriteLine(result);
        }
    }
}

写一个泛型扩展方法

namespace Malema.Extensions
{
    public static class NumberExtensions
    {
        public static bool IsGreaterThan<T>(this T i, T value) where T : IComparable 
        {
            return i.CompareTo(value) < 0 ? false : true;
        }
    }
}

常规静态方法和扩展方法之间的唯一区别是扩展方法的第一个参数指定要对其进行操作的类型,前面是 this 关键字。

要记住的要点:

  • 扩展方法是额外的自定义方法,它们最初不包含在类中。
  • 可以将扩展方法添加到自定义、.NET Framework 或第三方类、结构或接口。
  • 扩展方法的第一个参数必须是扩展方法适用的类型,以 this 关键字开头。
  • 通过包含扩展方法的命名空间,可以在应用程序的任何地方使用扩展方法。
上一篇:C# 协变逆变
下一篇:C# 流 Stream IO
最近更新的
...