zoukankan      html  css  js  c++  java
  • [原创]扩展方法基本用法

    前言

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

     

  • 相关阅读:
    jQuery学习易忘细节
    mysql关键字与自己设置的字段冲突
    jquery导航栏html页面跳转导航字体变色
    css解决谷歌,360浏览器默认最小字体为12px问题
    ThinkPHP中关于JS文件如何添加类似__PUBLIC__图片路径
    (谷歌浏览器等)解决css中点击input输入框时出现外边框方法【outline:medium;】
    为何在font-family属性中设置多个值
    jquery实现简单的Tab切换菜单
    Thinkphp下嵌套UEditor富文本WEB编辑器
    thinkphp框架下404页面设置
  • 原文地址:https://www.cnblogs.com/fenglingyi/p/MVC.html
Copyright © 2011-2022 走看看