[原创]扩展方法基本用法

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: |||超大  

前言 首先我们看看msdn上面的解释:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

其实说白了就是微软那班哥们写好的类库,我们无法修改,但是我们可以给这些类库通过一种方式添加我们的一些方法。

1.0 扩展方法应用场景DateTime now =DateTime.Now;//1.0 将now格式化成yyyy-MM-dd 输出stringfmtstr = now.Tostring("yyyy-MM-dd");

//2.0 将now格式化成yyyy-MM-dd HH:mm:ss 输出

string fmtstr1 = now.Tostring("yyyy-MM-dd");

现在在这里只有一次没有什么问题,假如在我们的系统中要用到成千上万次了? 这个时候我们该怎么办了,聪明的你,肯定想到了写一个方法...

publicstaticclassExtHelper

{publicstaticstringfmtDatayyyymmdd(DateTime now)

{returnnow.ToString("yyyy-MM-dd");

}publicstaticstringfmtDatayyyymmddhhmmss(DateTime now)

{returnnow.ToString("yyyy-MM-dd HH:mm:ss");

}}

经过改造,上面的代码可以改写为如下:

DateTime now =DateTime.Now;//1.0 将now格式化成yyyy-MM-dd 输出stringfmtstr =ExtHelper.fmtDatayyyymmdd(now);//2.0 将now格式化成yyyy-MM-dd HH:mm:ss 输出stringfmtstr1 =ExtHelper.fmtDatayyyymmddhhmmss(now);

可是程序员都是很懒的,那么我们必须把这个ExtHelper记住,想想我们还有没有更好的方法,如果要是能够now.方法名就很好了,扩展方法就能满足我们的这个要求...

2.0扩展方法三要素扩展方法的写法步骤:

1、必须放到静态类中

2、方法必须是静态方法

3、方法的第一个参数是类型参数,使用this 开头

经过改造的ExtHelper类

publicstaticclassExtHelper{publicstaticstringfmtDatayyyymmdd(thisDateTime now)

{returnnow.ToString("yyyy-MM-dd");

}publicstaticstringfmtDatayyyymmddhhmmss(thisDateTime now)

{returnnow.ToString("yyyy-MM-dd HH:mm:ss");

}

}

调用如下:

DateTime now =DateTime.Now;//1.0 将now格式化成yyyy-MM-dd 输出stringfmtstr =now.fmtDatayyyymmdd();//2.0 将now格式化成yyyy-MM-dd HH:mm:ss 输出stringfmtstr1 = now.fmtDatayyyymmddhhmmss();

3.0扩展方法的特点1、扩展方法优先级要低于实例方法

publicstaticclassExtHelper

{publicstaticstringToUpper(thisstringstr)

{returnstr.ToUpper();

}

}

我们都知道在string上面有一个ToUpper方法,如果此时我们在定义一个同样的扩展方法,这个方法将不起作用...

2、扩展方法可以与实例方法构成方法的重载

publicstaticclassExtHelper

{publicstaticstringToUpper(thisstringstr,intnum)

{returnstr.ToUpper() +num;

}

}

此时,如果我们有自己的业务逻辑,那么我们可以和实例方法构成重载...

3、定义在父类上面的扩展方法,在子类对象上可以使用

publicinterfaceipig { }publicclassPig : IPig

{PRivatestring_name;publicstringName

{get{return_name;

}set{if(value.Length >=2)

{

_name=value;

}else{//抛出异常}

}

}//自动属性publicintAge

{get;set;

}

}publicclasssmallPig : Pig { }

public static class ExtHelper

{

public static string Get(this Pig pig)

{

return pig.Name;

}

}

子类也可以点出扩展方法

var pig = new Pig();

pig.Get();

var spig = new smallPig();

spig.Get();

4、定义在接口上面的扩展方法,在实现类对象上可以使用 (EF,MVC使用很频繁)

public static class ExtHelper

{

public static void Set(this IPig ipig)

{

}

}

接口实现类也可以点出扩张方法。在MVC中的扩展在IQueryable<T>中的扩展方法,在Dbset<T>中使用

var pig = new Pig();

pig.Get();

pig.Set();

var spig = new smallPig();

spig.Get();

spig.Set();

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有