博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#扩展方法
阅读量:7243 次
发布时间:2019-06-29

本文共 2832 字,大约阅读时间需要 9 分钟。

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

这是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    {        ///         /// 将字符串转换为Int        ///         ///         /// 
当转换失败时返回0
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(判断是否在此时间范围内),代码如下:

///    /// 此时间是否在此范围内 -1:小于开始时间 0:在开始与结束时间范围内 1:已超出结束时间   ///    ///    ///    ///    /// 
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("
"); use2(); } /// /// 没有用扩展方法 /// private void use1() { string s = "abc"; int i = StrToInt(s); Response.Write("没有用扩展方法:" + i); } /// /// 使用扩展方法 /// 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/liuslayer/p/4724520.html

你可能感兴趣的文章
通过qsort(void * lineptr[], int left, int rifht, int (*comp)(void *, void *))解读指针函数和void指针...
查看>>
大学该怎么度过
查看>>
Windows服务创建及安装
查看>>
C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录
查看>>
VS2012 编译GDAL
查看>>
腾讯笔试题
查看>>
Ext中 get、getDom、getCmp的区别
查看>>
Flash builder 调试技巧 (分享)
查看>>
逻辑数据库设计 - 单纯的树(递归关系数据)
查看>>
ylbtech-权限管理-数据库设计-功能权限管理技术
查看>>
Build Android-x86 ICS 4 Virtualbox from Google Virtualbox Target and Intel Kernel 编译体验
查看>>
Android 中如何使用动画
查看>>
浏览器的工作原理:新式网络浏览器幕后揭秘
查看>>
菜鸟学Java(十四)——Java反射机制(一)
查看>>
Oracle Form Developer: Folder FRM-99999 Error 14212
查看>>
IOS使用AVAudioPlayer播放mp3歌曲文件并监听来电打断
查看>>
smarty 双引号中嵌入变量的方法
查看>>
MSMQ
查看>>
Android 神兵利器—— Adb 常用命令
查看>>
转:关于知乎音视频学习入门的解答
查看>>