.NET 扩展方法解密

今天我们接着看一下.NET 3.x的新特性:扩展方法。这里需要说明的是我所说的.NET 3.x的新特性,其实是C# 3.0的一些新特性,考虑到LinQ等我就把这些特性叫做.NET 3.x新特性。可能这样叫会有些歧义,但是我还是觉的这样还好,闲话不多说让我们进入正题。我觉得在C#3.0中引入自动化属性等就已经减少了我们不少负担,而扩展方法是我最喜欢的,它提供的可视化提示中显得更为巧妙。但是我也会觉得有点烦琐,当一个类的扩展方法太多时,就像有LinQ存在的情况下,会出现一大批的提示方法......

  什么是扩展方法?他的语法又是怎么样的?让我们来看看。扩展方法必须定义在静态函数中,扩展的方法也必须是静态函数。这对于一些方法类的扩展提供了良好的支持,特别是对接口的补充更是极品啊,通常我们在用DataReader取对象时都需要一个转换,而通过dr(DataReader实例)的一些方法如:GetString(int),GetInt32(ing)...其中的参数都是列的索引,通常我们都需要填写列的名称,这样我们就可以对IDataReader接口进行扩展:

1. interface definition:  

namespace AttributeSpace
{
   public interface IInterfaceDemo
   {

         public void show();
   }
}

2.Extension class definition:

namespace AttributeSpace
{


 public static class MyExtension
 {


  public static bool IsMatchEmail(this string s)
  {

 

    public static string DecorateText( this IInterfaceDemo objInterface ,string text)
    {


     text = text + " decoration!";
     return text;


    }


 }


}

 

3. class that implement  the interface

namespace AttributeSpace
{
 public class ClassForInterface : IInterfaceDemo
 {

 }
}

 

4. test the extension method:

namespace AttributeSpace
{
 class Program
 {
  static void Main(string[] args)
  {

   ClassForInterface inter = new ClassForInterface();
   string text = inter.DecorateText("廖常煌");
   Console.WriteLine("my new name is {0}", text);
   Console.Read();
  }
 }
}


  从上面我们也可以知道他的语法,首先要有一个静态类MyExtensions,对IInterfaceDemo接口的扩展,需要加入this IInterfaceDemo,而参数就是列名text。下面我们来看看他在VS中是怎么智能提示的呢?

  在上面我们可以看到在inter对象中出现了上面扩展的提示(extension),原来IInterfaceDemo自带的只有一个show()方法,现在看到了另外一个方法DecorateText,这样是不是感觉上好一点?注意:如果你要用此扩展必须引入所在的命名空间。

  在扩展方法中有一种继承作用,如果当你在父扩展方法类(如上面的IInterfaceDemo)上添加扩展方法后,则他的子类也同样具有此扩展。如果我们想在所有类中都有的方法我们就可以对Object进行扩展,那样在所有类中都会具有此扩展的方法,只要你引用了他所做的空间。例如:我们如果要判断当前实例是否为集合或列表中的一个项,我们就可以对Object进行扩展,代码如下:

  我们可以在所有的对象中得到此扩展,可以参考下图:

  我们知道其实整个LinQ都是方法的扩展,这个我们把它留到以后研究他时再说,因为LinQ有三大部分,一个是相对于类的,一个是To SQL的,还有一个是To XML的。当年都把他们叫做LinQ,DLinQ,XLinQ现在好像没有这么个教法,我们就顺从微软的意愿吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值