当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 在C#3.0中使用扩展方法来扩展接口

ASP.NET
blog程序新版本V2.0 Beta完成,提供V1.0全部源码下载
“/”应用程序中的服务器错误
asp.net(c#)复数类(复数加减乘除四则运算)
asp.net(c#)不可访问,因为它受保护级别限制
asp.net(c#) 水仙花数
ASP.NET实现用图片进度条显示投票结果
asp.net(c#) MS AJAX的安装
asp.net(c#)有关 Session 操作的几个误区
ASP.net基础知识之常见错误分析
[.net] 操纵自如-页面内的配合与通信
c# static的全部用法收集整理
使CheckBoxList的Attributes属性生效(修改微软的一个bug)
在ASP.NET中使用Session常见问题集锦
[原创]完美解决Could not load file or assembly ''AjaxPro.2'' or one of its dependencies. 拒绝访问。
在Apache环境下成功的运行ASP.NET的注意事项
ClickOnce DIY全自动更新下载升级的自我实现
asp.net jscript 一句话木马
在ASP.Net中实现flv视频转换的代码
将DataTable中的一行复制到另一个DataTable的方法
在DataTable中执行Select("条件")后,返回DataTable的方法

ASP.NET 中的 在C#3.0中使用扩展方法来扩展接口


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 130 ::
收藏到网摘: n/a

  今天给大家介绍一些有关扩展方法的一些知识,主要讲解一下在C#3.0中使用扩展方法来扩展接口。

  1、扩展方法跟原来类的方法重名时候的处理逻辑

  2、扩展方法的嵌套

  现在我们来看扩展方法使用的第三个场景:使用扩展方法来扩展接口

  应用场景举例:

  我们有时候会发现最初定义的一个接口,在现在环境下,这个接口需要再增加一个函数。有了扩展方法后,我们在这种情况下又多了一种实现的选择。下面以代码来说明这个问题:

以下为引用的内容:
  namespace Hongjun.Guo
  {
  interface MyInterface
  {
  void Test01();
  }
  public class MyClass : MyInterface
  {
  public void Test01()
  {
  Console.WriteLine("Test01");
  }
  }
  static class MyExtensionMethods
  {
  public static void MyTest002(this MyInterface ii)
  {
  ii.Test01();
  }
  }
  }

  调用方法:

以下为引用的内容:
  using Hongjun.Guo;
  static void Main(string[] args)
  {
  MyInterface mm = new MyClass();
  mm.MyTest002();
  Console.ReadLine();
  }

  分析这样做的好处:

  1、如果我们实现 MyInterface 接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方。减少代码量。如果实现这个接口的类被封装在不同的组件中,一些组件由于其他原因难以修改,这时候用扩展方法来扩展接口真是给我们一剂良药呀;

  2、扩展方法被调用到,前提条件是扩展方法所在的命名空间被使用了。我们如果把接口跟扩展方法放到同一个命名空间,扩展方法需要引用命名空间的问题就可以认为不存在了。因为你要用这个接口,必然会引用这个命名空间。

  3、扩展方法扩展的接口,与你自己实现这个接口的类中自己实现的函数重名时候的问题(这时候也可以简单认为是这个类 override 了这个函数实现)。

  先说结论:这两个不存在冲突问题,你如果是接口调用,则是扩展方法,如果是实现类调用,则是实现类自己的方法,参看我前面博客对扩展方法跟原来类的方法重名时候的处理逻辑的描述,下面再以一段代码来描述这个问题。

以下为引用的内容:
  namespace Hongjun.Guo
  {
  interface MyInterface
  {
  void Test01();
  }
  static class MyExtensionMethods
  {
  public static void MyTest002(this MyInterface ii)
  {
  ii.Test01();
  }
  }
  public class MyClass : MyInterface
  {
  public void Test01()
  {
  Console.WriteLine("Test01");
  }
  public void MyTest002()
  {
  Console.WriteLine("MyTest002");
  }
  }
  }

  调用代码:

以下为引用的内容:
  using Hongjun.Guo;
  static void Main(string[] args)
  {
  MyInterface mm = new MyClass();
  mm.MyTest002();
  Console.WriteLine("***********");
  ((MyClass)mm).MyTest002();
  Console.ReadLine();
  }

  这段代码执行的结果是

  Test01

  ***********

  MyTest002

  分析:

  mm.MyTest002(); 这行代码是接口调用,则使用的是扩展方法。

  ((MyClass)mm).MyTest002(); 这行代码调用者类型是MyClass ,MyClass 实现了MyTest002 函数,则不是扩展方法调用。