[原创]扩展方法基本用法
前言 首先我们看看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();