扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
什么是扩展方法?他的语法又是怎么样的?让我们来看看。扩展方法必须定义在静态函数中,扩展的方法也必须是静态函数。这对于一些方法类的扩展提供了良好的支持,特别是对接口的补充更是极品啊,通常我们在用DataReader取对象时都需要一个转换,而通过dr(DataReader实例)的一些方法如:GetString(int),GetInt32(ing)...其中的参数都是列的索引,通常我们都需要填写列的名称,这样我们就可以对IDataReader接口进行扩展:
1 public static class Extensions
2 {
3 public static string GetString(this IDataReader dr,string name)
4 {
5 return dr.GetString(dr.GetOrdinal(name));
6 }
7
8 public static int GetInt32(this IDataReader dr, string name)
9 {
10 return dr.GetInt32(dr.GetOrdinal(name));
11 }
12 }
从上面我们也可以知道他的语法,首先要有一个静态类Extensions,对IDataReader接口的扩展,需要加入this IDataReader,而参数就是列名name。下面我们来看看他在VS中是怎么智能提示的呢?
在上面我们可以看到在dr对象中出现了上面扩展的提示(extension),原来IDataReader自带的只有一个GetString(int)方法,现在看到了有了个重载GetString(string)这样是不是感觉上好一点?注意:如果你要用此扩展必须引入所在的命名空间。
在扩展方法中有一种继承作用,如果你在当扩展方法类(如上面的IDataReader)扩展,则他的子类也同样具有此扩展。如果我们想在所有类中都有的方法我们就可以对Object进行扩展,那样在所有类中都会具有此扩展的方法,只要你引用了他所做的空间。例如:我们如果要判断当前实例是否为集合或列表中的一个项,我们就可以对Object进行扩展,代码如下:
1 public static bool IsEmailAddress(this string text)
2 {
3 Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
4 return regex.IsMatch(text);
5 }
6
7 public static bool IsIn(this object o, IEnumerable collection)
8 {
9 foreach (object item in collection)
10 {
11 if (item.Equals(o))
12 return true;
13 }
14 return false;
15 }
我们可以在所有的对象中得到此扩展,可以参考下图:
我们知道其实整个LinQ都是方法的扩展,这个我们把它留到以后研究他时再说,因为LinQ有三大部分,一个是相对于类的,一个是To SQL的,还有一个是To XML的。当年都把他们叫做LinQ,DLinQ,XLinQ现在好像没有这么个教法,我们就顺从微软的意愿吧。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者