C# 3.0及以后版本提供了扩展方法这一强大工具,使得动态扩展类变得十分方便。具体使用方法是定义一个static class,然后定义static扩展方法,注意扩展方法的第一个参数必须用this关键字修饰。扩展方法能像类本身定义的方法一样被使用,而不需要修改类的代码,这样扩展原有库中的类就变得非常容易了。扩展方法同样对接口生效,更牛X的是,扩展方法中同样可以使用泛型。
下面是一个例子,展示了怎样扩展IEnumerable接口,增加一个RandomSelect的方法用于在表中随机选取元素。
public static class IEnumerableExtensions
{
public static IEnumerable<T> RandomSelect<T>(this IEnumerable<T> input, int outputSize)
{
int size = input.Count();
if (outputSize < 0)
{
outputSize = 0;
}
if (outputSize > size)
{
outputSize = size;
}
List<int> index = new List<int>();
for (int i = 0; i < size; i++)
{
index.Add(i);
}
List<T> ret = new List<T>();
Random rand = new Random();
for (int i = 0; i < outputSize; i++)
{
int r = rand.Next() % (size - i);
ret.Add(input.ElementAt(index[r]));
index[r] = index[size - i - 1];
}
return ret;
}
}
使用方法和原生方法是一样一样的:)
List sourceList = new List() {1, 2, 3, 4, 5};
IEnumerable randomSelectedList = sourceList.RandomSelect(3);