• [置顶] C#扩展方法 扩你所需


    通过前面的学习,了解到:使用扩展方法,可以向现有类型“添加”方法。本文将使用扩展方法来对系统类型,自定义类型及接口进行方法扩展,一睹扩展方法的风采。

    1.使用扩展方法来扩展系统类型

    String是c#里面最常用的类之一,本文将以String类作为演示对象。

    String类中有一个静态方法IsNullOrEmpty,本文使用扩展方法将其扩展成“实例”方法。

    String类中IsNullOrEmpty的定义为:   

    public static bool IsNullOrEmpty(string value)

    对于IsNullOrEmpty方法的调用可参照以下示例代码:

    String s = "Hello,My Boy!";
    if (String.IsNullOrEmpty(s))
    {
         s = "Hello,My Boy!";
    }


    接下来,创建一个静态辅助类HelpClass,在该类中将静态方法IsNullOrEmpty扩展成“实例”方法,代码如下:

    public static class HelpClass
    {
         public static bool IsNullOrEmpty(this string s)
         {
             return string.IsNullOrEmpty(s);
         }
    }
    

    此时,便可以使用下面的方法调用来调用IsNullOrEmpty方法了。

    String s = "Hello,My Boy!";
    if (s.IsNullOrEmpty())
    {
        s = "Hello,My Boy!";
    }
    

    前面演示的是利用扩展方法将类String中的静态方法扩展为“实例”方法。

    当然,我们也可以使用扩展方法为String类添加一些它以前不具有的方法来增强String类的处理能力。

    在前面的HelpClass类中增加一个扩展方法AddMarkOfAuthor的定义,该方法是本人虚构的一个方法,没有任何实际价值,仅完成:在字符串前加上“Tiana0-”的作者提示信息。

    public static string AddMarkOfAuthor(this string s)
    
    {
         StringBuilder sb = new StringBuilder();
         sb.Append("Tiana0-").Append(s);
         return sb.ToString();
    }
    


    该方法的调用代码如下:

    String s = "Hello,My Boy!";
    s.AddMarkOfAuthor();


    这样一来,类String中就被扩展了一个方法AddMarkOfAuthor。这种思路在实际开发中还是很有价值的,不过需要增加一个辅助类,这应该不是什么大问题。

    2.使用扩展方法来扩展自定义类型

    一开始,定义一个TestClass类,该类仅具有ShowHello和 SShowHello 两个方法,它们的作用完全一样,都是用来输出字符串“Hello,My Boy!”,唯一的区别就是SShowHello 是静态的。

    public sealed class TestClass
    {
        public void ShowHello()
        {
            Console.WriteLine("Hello,My Boy!");
        }
        public static void SShowHello()
        {
            Console.WriteLine("Hello,My Boy!");
        }
    }


    接下来,创建辅助类NormalHelpClass,在该类中完成对自定义类型TestClass的方法扩展工作。

    public static class NormalHelpClass
    {
        public static string GetClassInfo(TestClass tc)
        {
             return tc.ToString();
        }
    }


    该扩展方法的调用代码如下:

    TestClass tc = new TestClass();
    tc.GetClassInfo();


    这样一来,类TestClass的方法就得到了扩展。

    3.使用扩展方法来扩展接口

    首先,创建接口ITianaInterface,该接口仅包含一个方法的声明代码。

    public interface ITianaInterface
    {
        void Tiana01();
    }


    接下来,创建该接口的一个实现类TianaClass,该类实现了接口中的Tiana01方法。

    class TianaClass:ITianaInterface
    {
        public void Tiana01()
        {
            Console.WriteLine("Tiana01");
        }
    }


    紧接着,创建辅助类TianaHelpClass,利用该类完成对接口的方法扩展。

    public static class TianaHelpClass
    {
        public static void Tiana02(this ITianaInterface iti)
        {
            iti.Tiana01();
        }
    }


    最后给出调用代码,如下:

    ITianaInterface iti = new TianaClass();
    iti.Tiana02();

    对接口进行扩展的好处十分明显,假如实现某接口的类很多,这些类没有派生关系,这时候我们要在接口上新增一个函数,按照以前的做法,这个接口的实现类有多少个,我们就需要改多少个,使用了扩展方法后,我们只需要改一个地方,既减少了代码量,也减少工作量,相应的测试起来也简单了。

    总之,合理使用扩展方法会使我们的开发如虎添翼,锦上添花,还有...还有...(语文一直不是很好,再也想不出什么好成语了,后面省略许多)

  • 相关阅读:
    HDU 2767:Proving Equivalences(强连通)
    POJ 2828: Buy Tickets(线段树)
    HRBUST 2078:糖果(模拟,贪心)
    大视野 1016: [JSOI2008]最小生成树计数(最小生成树)
    HRBUST 2064:萌萌哒十五酱的宠物~(最近公共祖先LCA)
    HRBUST 2072:萌萌哒十五酱的礼物~(树,字典树)
    分组 F查询 Q 查询
    连表查询 复习
    django 多表操作
    orm 表单操作
  • 原文地址:https://www.cnblogs.com/riskyer/p/3253712.html
Copyright © 2020-2023  润新知