扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。

先做个例子吧,以String为例,需要在字符串类型中加一个从字符串转为数值的功能。

以往我们可能是这样做的,会专门写一个方法做过转换

public static int StrToInt(string s)
{
    int id;
    int.TryParse(s, out id);//这里当转换失败时返回的id为0
    return id;
}

调用就使用

string s = "abc";
int i = StrToInt(s);

若是String类型有一个名为ToInt()(从字符串转为数值)的方法,就可以这样调用了

string s = "abc";
int i = s.ToInt();

这样看起来是不是更好,下面来看看具体怎么实现吧

第一步:

我先创建一个解决方案,一个web应用程序(webtest)及一个类库(W.Common)

在webtest项目添加引用W.Common项目

第二步:在类库中新建一个名为EString.cs类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace W.Common
{
    public static class EString
    {
        /// <summary>
        /// 将字符串转换为Int
        /// </summary>
        /// <param name="t"></param>
        /// <returns>当转换失败时返回0</returns>
        public static int ToInt(this string t)
        {
            int id;
            int.TryParse(t, out id);//这里当转换失败时返回的id为0
            return id;
        }
    }
}

看了上面的代码了吧,扩展方法规定类必须是一个静态类,EString是一个静态类,里面包含的所有方法都必须是静态方法。

msdn是这样规定扩展方法的:“扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

EString里有一个ToInt的静态方法,他接收一个自身参数this,类型为string,this string必须在方法参数的第一个位置。

这句话什么意思,即你需要对string扩展一个ToInt方法,this是string实例化后的对象,这可能说的不太清楚,我的表述能力能弱,不要见怪呀。。。通俗的说就是,扩展方法跟静态类的名称无关,只需要在一个静态类里面定义一个静态方法,第一个参数必须this string开头。

如果需要你要对DateTime类型扩展方法名为IsRange(判断是否在此时间范围内),代码如下:

/// <summary>
   /// 此时间是否在此范围内 -1:小于开始时间 0:在开始与结束时间范围内 1:已超出结束时间
   /// </summary>
   /// <param name="t"></param>
   /// <param name="startTime"></param>
   /// <param name="endTime"></param>
   /// <returns></returns>
   public static int IsRange(this DateTime t, DateTime startTime, DateTime endTime)
   {
       if (((startTime - t).TotalSeconds > 0))
       {
           return -1;
       }
       if (((endTime - t).TotalSeconds < 0))
       {
           return 1;
       }
       return 0;
   }

这里的扩展方法是用this DateTime打头,那么就可以这样调用

time.IsRange(t1,t2);//判断时间time是否在t1到t2的范围内

当前代码在使用扩展方法前需要先引用命名空间

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using W.Common;//这里引用扩展方法所在的命名空间
namespace webtest
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            use1();
            Response.Write("<br />");
            use2();
        }
        /// <summary>
        /// 没有用扩展方法
        /// </summary>
        private void use1()
        {
            string s = "abc";
            int i = StrToInt(s);
            Response.Write("没有用扩展方法:" + i);
        }
        /// <summary>
        /// 使用扩展方法
        /// </summary>
        private void use2()
        {
            string s = "2012";
            int i = s.ToInt();
            Response.Write("使用扩展方法:" + i);
        }
        public static int StrToInt(string s)
        {
            int id;
            int.TryParse(s, out id);//这里当转换失败时返回的id为0
            return id;
        }
    }
}

转载于:https://www.cnblogs.com/leicao/p/5268648.html

C#扩展方法的理解 (转)相关推荐

  1. 【转】五、谈扩展方法的理解

    [转]五.谈扩展方法的理解 为什么要用扩展方法 在说什么是扩展方法之前我们先来说说为什么要用扩展方法. 首先我们定义一个 Person 类: public class Person {/// < ...

  2. c#扩展方法的理解(二:接口)

    namespace ExtensionInterfaceMethod {class Program{static void Main(string[] args){//使用接口变量来调用扩展方法IBa ...

  3. [C# 基础知识系列]专题十五:全面解析扩展方法

    引言:  C# 3中所有特性的提出都是更好地为Linq服务的, 充分理解这些基础特性后.对于更深层次地去理解Linq的架构方面会更加简单,从而就可以自己去实现一个简单的ORM框架的,对于Linq的学习 ...

  4. JQuery添加扩展方法(理解$.extend(),与$.fn.extend()方法区别)

    为什么80%的码农都做不了架构师?>>>    理解$.extend(),与$.fn.extend()方法区别 1.$.extend()方法 $.extend()方法在JQuery中 ...

  5. C#拾遗系列(9):继承、接口、扩展方法、分部类、类操作、Ref and Out、可空类型...

    本文内容: 继承 Equal示例 结构和类 属性 Ref and Out 类操作 扩展方法 接口 可空类型 分部类 1. 继承 using System; using System.Collectio ...

  6. Jquery_如何扩展方法

    jQuery 别名 $ 一.  类级别扩展方法(比如$.ajax(...)) 1> 单个全局方法 $.testExtend = function (){console.log("单个全 ...

  7. Linq 下的扩展方法太少了,您期待的 MoreLinq 来啦

    一:背景 1. 讲故事 前几天看同事在用 linq 给内存中的两个 model 做左连接,用过的朋友都知道,你一定少不了一个叫做 DefaultIfEmpty 函数,这玩意吧,本来很流畅的 from. ...

  8. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除了直接用ApplicationBuilder的Use()方法注册中间件外,还可以使用ApplicationB ...

  9. dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法

    什么是中间件 中间件是在管道中处理Request请求与Responses响应的一种组件,每种组件可以选择是否让Request进入到下一个组件去处理. 译得不好,大家可以自己看原文Middleware ...

  10. java虚拟内存扩展_Java 8虚拟扩展方法

    java虚拟内存扩展 我一直关注Java 8 Lambda表达式项目的发展已经有一段时间了,我对其当前的进展状态感到非常兴奋. 我发现的最新"易于理解"的演示文稿是这样的: htt ...

最新文章

  1. Java统计1到300_java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)...
  2. 致敬YOLO!华科提出YOLOS:基于视觉Transformer的目标检测
  3. fgo日服服务器维护,【FGO日服】活动维护通知(1/10)
  4. 软件测试2019:第七次作业—— 用户体验测试
  5. go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...
  6. python观察日志(part21)--ord,chr,unichr方法的联系与区别
  7. MYSQL jdbc autoReconnect
  8. python中主要内建函数
  9. 可持续字典树 Perfect Security
  10. 为什么要使用getter/setter
  11. 易语言修改虚拟机硬盘id_易语言本地虚拟机源码
  12. 14.docker volumn
  13. DeepFake技术--Deepfakes教程及各个换脸软件下载
  14. CodeGym—Java自学神器
  15. 华成英-模拟电子技术P8 放大电路的分析方法 讨论题目
  16. Windows常用运行库(VC++、DirectX、.NET)
  17. linux aria2 使用教程,Aria2使用详细教程
  18. 2022-2028年中国尘螨脱敏治疗药物行业市场运行态势及发展战略研究报告
  19. 基于Echarts实现可视化数据大屏分析大屏监控系统
  20. tcpdump wireshark安装及 tcpdump 的试用

热门文章

  1. 字符集_一文搞清楚unicode字符集的三种实现方式
  2. ugp和千幻魔镜买哪个好_美的空调和格力空调哪个好?这两个牌子您会买哪个?...
  3. 遗传算法python与matlab_遗传算法简单介绍与MATLAB实现
  4. EM算法在二维高斯混合模型参数估计中的应用
  5. Vue2.0七——生命周期
  6. iOS 容器 addChildViewController
  7. xpath提取目录下所有标签内的内容,递归 //text()
  8. 数据绑定以及Container.DataItem几种方式与使用方法分析
  9. 经典中的博弈:第一章 C++的Hello,World!
  10. 【技术专题研究】OSPF的LSA类型