码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-02-24 17:25:25      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

前言

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

  技术分享

 

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

如果您看完本篇文章感觉不错,请点击右下角的 推荐 技术分享

http://www.cnblogs.com/fenglingyi


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

标签:

原文地址:http://www.cnblogs.com/fenglingyi/p/MVC.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!