扩展方法,顾名思义,是原有的对象附加一个新的方法。 扩展方法允许您在不修改、派生或重新编译原始类、结构或接口的情况下注入额外的方法。 可以将扩展方法添加到您自己的自定义类、.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 关键字。