[原创]扩展方法基本用法
前言
首先我们看看msdn上面的解释:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
其实说白了就是微软那班哥们写好的类库,我们无法修改,但是我们可以给这些类库通过一种方式添加我们的一些方法。
1.0 扩展方法应用场景
DateTime now = DateTime.Now; //1.0 将now格式化成yyyy-MM-dd 输出 string fmtstr = now.Tostring("yyyy-MM-dd");
//2.0 将now格式化成yyyy-MM-dd HH:mm:ss 输出
string fmtstr1 = now.Tostring("yyyy-MM-dd");
现在在这里只有一次没有什么问题,假如在我们的系统中要用到成千上万次了? 这个时候我们该怎么办了,聪明的你,肯定想到了写一个方法...
public static class ExtHelper { public static string fmtDatayyyymmdd(DateTime now) { return now.ToString("yyyy-MM-dd"); } public static string fmtDatayyyymmddhhmmss(DateTime now) { return now.ToString("yyyy-MM-dd HH:mm:ss"); } }
经过改造,上面的代码可以改写为如下:
DateTime now = DateTime.Now; //1.0 将now格式化成yyyy-MM-dd 输出 string fmtstr = ExtHelper.fmtDatayyyymmdd(now); //2.0 将now格式化成yyyy-MM-dd HH:mm:ss 输出 string fmtstr1 =ExtHelper.fmtDatayyyymmddhhmmss(now);
可是程序员都是很懒的,那么我们必须把这个ExtHelper记住,想想我们还有没有更好的方法,如果要是能够now.方法名就很好了,扩展方法就能满足我们的这个要求...
2.0扩展方法三要素
扩展方法的写法步骤:
1、必须放到静态类中
2、方法必须是静态方法
3、方法的第一个参数是类型参数,使用this 开头
经过改造的ExtHelper类
public static class ExtHelper { public static string fmtDatayyyymmdd(this DateTime now) { return now.ToString("yyyy-MM-dd"); } public static string fmtDatayyyymmddhhmmss(this DateTime now) { return now.ToString("yyyy-MM-dd HH:mm:ss"); } }
调用如下:
DateTime now = DateTime.Now; //1.0 将now格式化成yyyy-MM-dd 输出 string fmtstr = now.fmtDatayyyymmdd(); //2.0 将now格式化成yyyy-MM-dd HH:mm:ss 输出 string fmtstr1 = now.fmtDatayyyymmddhhmmss();
3.0扩展方法的特点
1、扩展方法优先级要低于实例方法
public static class ExtHelper { public static string ToUpper(this string str) { return str.ToUpper(); } }
我们都知道在string上面有一个ToUpper方法,如果此时我们在定义一个同样的扩展方法,这个方法将不起作用...
2、扩展方法可以与实例方法构成方法的重载
public static class ExtHelper { public static string ToUpper(this string str, int num) { return str.ToUpper() + num; } }
此时,如果我们有自己的业务逻辑,那么我们可以和实例方法构成重载...
3、定义在父类上面的扩展方法,在子类对象上可以使用
public interface IPig { } public class Pig : IPig { private string _name; public string Name { get { return _name; } set { if (value.Length >= 2) { _name = value; } else { //抛出异常 } } } //自动属性 public int Age { get; set; } } public class smallPig : Pig { }
1 2 3 4 5 6 7 8 9 | public static class ExtHelper { public static string Get( this Pig pig) { return pig.Name; } } |
子类也可以点出扩展方法
1 2 3 4 5 | var pig = new Pig(); pig.Get(); var spig = new smallPig(); spig.Get(); |
4、定义在接口上面的扩展方法,在实现类对象上可以使用 (EF,MVC使用很频繁)
1 2 3 4 5 6 7 | public static class ExtHelper { public static void Set( this IPig ipig) { } } |
接口实现类也可以点出扩张方法。在MVC中的扩展在IQueryable<T>中的扩展方法,在Dbset<T>中使用
1 2 3 4 5 6 7 | var pig = new Pig(); pig.Get(); pig.Set(); var spig = new smallPig(); spig.Get(); spig.Set(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?