注意点:
- 必须在一个非嵌套的、非泛型的静态类中(所以必须是一个静态方法)
- 至少有一个参数
- 第一个参数必须附加this关键字作为前缀
- 第一个参数不能有其他任何修饰符(比如out、ref)
- 第一个参数的类型不能是指针类型
扩展方法最大的用途就是为LINQ服务,Enumerable和Queryable都是在System.Linq命名空间中,Enumerable的大多数扩展的是IEnumerable<T>,Queryable的大多数扩展的是IQueryable<T>。
public class Person
{
public string Name { set; get; }
public int Age { set; get; }
}
public static class Extension
{
//Person的扩展方法,根据年龄判断是否是成年人
public static bool IsChild(this Person oPerson)
{
if (oPerson.Age >= 18)
return false;
else
return true;
}
}
附上经典的linq中Distinct去重,我们无法按照具体需求或某个字段去重,这时候扩张方法就派上用场了
public static class DistinctExtensions
{
public static IEnumerable<T> Distinct<T, V>(this IEnumerable<T> source, Func<T, V> keySelector)
{
return source.Distinct(new CommonEqualityComparer<T, V>(keySelector));
}
}
public class CommonEqualityComparer<T, V> : IEqualityComparer<T>
{
private Func<T, V> keySelector;
public CommonEqualityComparer(Func<T, V> keySelector)
{
this.keySelector = keySelector;
}
public bool Equals(T x, T y)
{
return EqualityComparer<V>.Default.Equals(keySelector(x), keySelector(y));
}
public int GetHashCode(T obj)
{
return EqualityComparer<V>.Default.GetHashCode(keySelector(obj));
}
}
使用
Product[] products =
{
new Product { Name = "Smallapple", Code = 9 },
new Product { Name = "orange", Code = 4 },
new Product { Name = "Bigapple", Code = 9 },
new Product { Name = "lemon", Code = 12 }
};
var p1 = products.Distinct(p => p.Code); //按照code来去重
foreach (Product pro in p1)
Console.WriteLine(pro.Name + "," + pro.Code);
Console.ReadKey();
网友评论