通过前面的学习,了解到:使用扩展方法,可以向现有类型“添加”方法。本文将使用扩展方法来对系统类型,自定义类型及接口进行方法扩展,一睹扩展方法的风采。

1.使用扩展方法来扩展系统类型

String是c#里面最常用的类之一,本文将以String类作为演示对象。

String类中有一个静态方法IsNullOrEmpty,本文使用扩展方法将其扩展成“实例”方法。

String类中IsNullOrEmpty的定义为:

public static bool IsNullOrEmpty(string value)

对于IsNullOrEmpty方法的调用可参照以下示例代码:

String s = "Hello,My Boy!";
if (String.IsNullOrEmpty(s))
{
s = "Hello,My Boy!";
}

接下来,创建一个静态辅助类HelpClass,在该类中将静态方法IsNullOrEmpty扩展成“实例”方法,代码如下:

public static class HelpClass
{
public static bool IsNullOrEmpty(this string s)
{
return string.IsNullOrEmpty(s);
}
}

此时,便可以使用下面的方法调用来调用IsNullOrEmpty方法了。

String s = "Hello,My Boy!";
if (s.IsNullOrEmpty())
{
s = "Hello,My Boy!";
}

前面演示的是利用扩展方法将类String中的静态方法扩展为“实例”方法。

当然,我们也可以使用扩展方法为String类添加一些它以前不具有的方法来增强String类的处理能力。

在前面的HelpClass类中增加一个扩展方法AddMarkOfAuthor的定义,该方法是本人虚构的一个方法,没有任何实际价值,仅完成:在字符串前加上“Tiana0-”的作者提示信息。

public static string AddMarkOfAuthor(this string s)

{
StringBuilder sb = new StringBuilder();
sb.Append("Tiana0-").Append(s);
return sb.ToString();
}

该方法的调用代码如下:

String s = "Hello,My Boy!";
s.AddMarkOfAuthor();

这样一来,类String中就被扩展了一个方法AddMarkOfAuthor。这种思路在实际开发中还是很有价值的,不过需要增加一个辅助类,这应该不是什么大问题。

2.使用扩展方法来扩展自定义类型

一开始,定义一个TestClass类,该类仅具有ShowHello和 SShowHello 两个方法,它们的作用完全一样,都是用来输出字符串“Hello,My Boy!”,唯一的区别就是SShowHello 是静态的。

public sealed class TestClass
{
public void ShowHello()
{
Console.WriteLine("Hello,My Boy!");
}
public static void SShowHello()
{
Console.WriteLine("Hello,My Boy!");
}
}

接下来,创建辅助类NormalHelpClass,在该类中完成对自定义类型TestClass的方法扩展工作。

public static class NormalHelpClass
{
public static string GetClassInfo(TestClass tc)
{
return tc.ToString();
}
}

该扩展方法的调用代码如下:

TestClass tc = new TestClass();
tc.GetClassInfo();

这样一来,类TestClass的方法就得到了扩展。

3.使用扩展方法来扩展接口

首先,创建接口ITianaInterface,该接口仅包含一个方法的声明代码。

public interface ITianaInterface
{
void Tiana01();
}

接下来,创建该接口的一个实现类TianaClass,该类实现了接口中的Tiana01方法。

class TianaClass:ITianaInterface
{
public void Tiana01()
{
Console.WriteLine("Tiana01");
}
}

紧接着,创建辅助类TianaHelpClass,利用该类完成对接口的方法扩展。

public static class TianaHelpClass
{
public static void Tiana02(this ITianaInterface iti)
{
iti.Tiana01();
}
}

最后给出调用代码,如下:

ITianaInterface iti = new TianaClass();
iti.Tiana02();

对接口进行扩展的好处十分明显,假如实现某接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方,既减少了代码量,也减少工作量,相应的测试起来也简单了。

总之,合理使用扩展方法会使我们的开发如虎添翼,锦上添花,还有...还有...(语文一直不是很好,再也想不出什么好成语了,后面省略许多)

[置顶] C#扩展方法 扩你所需的更多相关文章

  1. VC关于置顶窗口的方法小结

    转摘自:http://blog.csdn.net/wirror800/article/details/4002381 将窗体置顶的方法有: //将窗体置顶的API函数 ::SetWindowPos(m ...

  2. PHPCMS实现文章置顶功能的方法

    我个人喜欢把PHPCMS当作博客来用,而作为一个博客,怎能少了文章置顶功能呢?其中用PHPCMS实现置顶功能非常简单,无非是修改下推荐位的名称为置顶,然后在文章列表中推送需要置顶的文章罢了. 不过博客 ...

  3. [置顶] hdu2815 扩展Baby step,Giant step入门

    题意:求满足a^x=b(mod n)的最小的整数x. 分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会 ...

  4. wordpress调用置顶文章sticky_posts的三种方法

    有时我们在开发wordpress时需要调用置顶文章sticky_posts,怎么调用呢?几种写法,有用到query_post的,有用到WP_Query,也有用到is_sticky(),下面随ytkah ...

  5. 扩展方法(C#)

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 下面的示例为String添加 ...

  6. C#扩展方法知多少

    前言:上篇 序列化效率比拼——谁是最后的赢家Newtonsoft.Json 介绍了下序列化方面的知识.看过Demo的朋友可能注意到了里面就用到过泛型的扩展方法,本篇打算总结下C#扩展方法的用法.博主打 ...

  7. 《精通C#》自定义类型转化-扩展方法-匿名类型-指针类型(11.3-11.6)

    1.类型转化在C#中有很多,常用的是int类型转string等,这些都有微软给我们定义好的,我们需要的时候直接调用就是了,这是值类型中的转化,有时候我们还会需要类类型(包括结构struct)的转化,还 ...

  8. C#扩展方法入门

    扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的. 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀. 仅当你使用 using 指令将命名空间显式导入到源代码 ...

  9. 转:扩展方法(C# 编程指南)

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual ...

随机推荐

  1. js 报错 :object is not a function

    object is not a function 我遇到的具体问题是:js命名方法重复了,找到了别的地方,改个方法名就可以了 var h2_price = document.getElementByI ...

  2. GO语言搭建

    最近对GO语言产生了浓厚的兴趣.因为GO语言不仅仅可以开发桌面.web程序,最吸引我的是安卓大有往GO语言全方位靠拢的趋势,自家的系统还是用自家的语言开发比较靠谱. 用一句话来说:Go语言是谷歌200 ...

  3. C/C++招聘的一些感受和经验【转】

    找工作本人认为最重要的就是前期准备了.     首先.简历一定要写的切合主题.招聘单位要的是你的技能,这个只要大概能符合就可以,关键他们需要的是你的开发经验,一定要在简历中完美的体现出你之前所参与的项 ...

  4. html5test

    html5test Github https://github.com/NielsLeenheer/html5test 主程序是 scripts/7/engine.js 目前看到的分类大部分是基于判断 ...

  5. OSG中的视角 eye up center

    这三个值都是vec3变量,其中eye和center确定视角         eye就相当于人的眼睛,我们观察场景,是从这个坐标去看的,然后有了眼睛,我们观察得有一个方向,那么久需要另外一个坐标,就是c ...

  6. 微信网页授权java实现

    功能:主要用于在用户通过手机端微信访问第三方H5页面时获取用户的身份信息(openId,昵称,头像,所在地等..)可用来实现微信登录.微信账号绑定.用户身份鉴权等功能.     开发前的准备: 1.需 ...

  7. DLR、ASTER GDEM、SRTM3、GMTED2010等5种全球高程数据对比

      目前网上有多种全球高程数据,国内在这方面也进步喜人,资源三号目前已放出来的卫片给了不少惊喜,其高程数值得期待.但资源三号的高程数据放出来还需等待,过去两三年全球高程数据发展相当迅猛,DLR放出了相 ...

  8. 限制**类型物料不能输入BOM

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name CUX_BOMFDBOM 表单名 Form Name CUXBOMFD ...

  9. javascript数组去重算法-----4

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解析nodejs微信开发-2获取ticket

    获取ticket是需要拼接url,url中需要获得的tocken 1.先判断有无tocken:若有则拼接url: 2.请求url: a.处理回调数据,注意时间戳和签名处理方式,此两项并未存到ticke ...