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

前言

首先我们看看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 { }
 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();

  

如果您看完本篇文章感觉不错,请点击左上角的【关注】来支持一下博主,谢谢!

如果您看完本篇文章感觉不错,请点击右下角的 【 推荐 】



作者:枫伶忆

QQ: 616931

出处:http://www.cnblogs.com/fenglingyi

声明:本文版权归作者和博客园共有,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利


时间: 2024-10-05 11:29:54

[原创]扩展方法基本用法的相关文章

扩展方法的快速理解

---恢复内容开始--- 今天记录一下自己对扩展方法的理解,扩展方法就是实现某种功能但是在原有的类或程序集中又不存在这种功能实现的方法或者封装,继而衍生出扩展方法.但是新建一个类来封装实现这种功能的方法也可以达到目的而且使用继承机制也可以实现,为何有衍生扩展方法呢? 第一种方式是比较通用的一种方式,也是通常情况下使用最多的,但和扩展方法比较来说,代码的可读性不如扩展方法. 继承的方式是一个很好的扩展方案,但有时不一定是完美的,比如:a. 每次继承都会产生新类,且使用时需要进行相应的强制转换(st

C#扩展方法知多少

前言:上篇 序列化效率比拼——谁是最后的赢家Newtonsoft.Json 介绍了下序列化方面的知识.看过Demo的朋友可能注意到了里面就用到过泛型的扩展方法,本篇打算总结下C#扩展方法的用法.博主打算分三个层面来介绍这个知识点,分别是:.Net内置对象的扩展方法.一般对象的扩展方法.泛型对象的扩展方法. 什么是扩展方法?回答这个问题之前,先看看我们一般情况下方法的调用.类似这样的通用方法你一定写过: static void Main(string[] args) { string strRes

扩展方法用法及其原理和注意事项

前言 一直以来尤其像C#一些常见的语法,本人更愿意去探讨其内部实现的原理,为什么要这么做呢?只是为了当我真正在开发中运用语法的时候不会因为犯常识性错误或者说因为一些注意事项未曾注意到而耽误一些无谓的时间,同时也能理解的更深入而不是仅仅停留在表面(或许理解也不是太透).(当然本人能力有限,太高深的东西必定是研究不明白了,也只有这能力了). 概念 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例

扩展方法用法整理

扩展方法貌似平时很少用,平时基本都是用静态方法,其实静态方法也挺方便的. class Program { static void Main(string[] args) { var p = new Person() { BirthTime = DateTime.Parse("1990-07-19") }; var age = p.GetAge();//扩展方法调用起来更顺眼 age = ExtensionClass.GetAge2(p);//静态方法调用 Console.ReadKey

【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法

               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html 前言 真正意义上的随机数(或者随机事件)在某次产生过程中是按照实验过程中表现的分布概率随机产生的,其结果是不可预测的,是不可见的.而计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的.我们可以这样

泛型List集合转化为DateTable的扩展方法

文章出处:http://www.codeproject.com/Tips/867866/Extension-Method-for-Generic-List-Collection-to-Da 这段代码是能够帮助你把泛型集合List转出成DataTable的扩展方法. 背景: 不知道你是否知道这个扩展方法,但是你可以不做任何修改的去使用下面这个类的代码. 使用代码:   using System; using System.Collections.Generic; using System.Comp

List扩展方法汇总(仅备注)

不管在c/s还是b/s的c#语言开发程序中,经常会用到List的扩展方法,尤其在json格式的数据和服务端交互越来越流行,很多时候总是在开发使用到的时候才去搜索有些扩展方法或者linq的用法,在这里,我们只是做一个备注 因为linq没有必要系统的学习,我们只要简单的在list的扩展会使用即可,至少我只这么认为的 本文没有任何技术性,只是备注list或者list泛型的扩展方法,不至于在您不熟悉但是又使用到的时候到处搜索 1 public sealed class Employee 2 { 3 pu

Extension Methods(扩展方法)

在 OOPL 中,有静态方法.实例方法和虚方法,如下: public sealed class String { public static bool  IsNullOrEmpty(string s) { // ... } public string Replace(string old, string new) { // ... } } public abstract class Stream { public virtual void WriteByte(byte value) { // .

ASP.Net string 类的扩展方法 [转]

string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<>     //累加 All<>        //是否都满足条件 Any<>        //是否有一个满足条件 AsEnumerable<>  // AsParallel<>    // AsQueryable<>    // Average<>      //平均值 Cast<>