扩展方法

    这篇谈谈扩展方法,顾名思义,扩展即对某一个事物进行增加,或者增加一些功能。那扩展方法呢?比如我们现在有一个类A,但是这个类就标记成了sealed,我们不能继承这个类,又或者我们现在手上有一个dll,可以是买来的,可以是任何途径你得到的,但是你发现这个dll中有一个些类的功能并不是你想要的,或者没有你想要的,但是你却加不了任何方法。这个时候就可以用扩展方法。扩展方法即扩展我们想要扩展功能但却不能继承,不能修改源代码的类。

    首先,扩展framerwork的string类,因为string类是sealed类

    首先是扩展类

namespace ExtensionMethod

{

   public static class ExtensionString

    {

       public static void Extension(this string s)

       {

           Console.WriteLine("String is Extensioned");

       }

    }

}

扩展类是静态的,扩展方法也是静态的,方法的参数名称是要扩展的类型,为了区分参数,和扩展的类型,必须在要扩展的类型前加this关键字。

 调用代码

 static void Main(string[] args)

        {

            string s = "Hello World";

            s.Extension();

            Console.Read();

        }

下面我们在扩展类里面加上一个重载方法

public static class ExtensionString

    {

       public static void Extension(this string s)

       {

           Console.WriteLine("String is Extensioned");

       }



       public static void Extension(this string s, string name)

       {

           Console.WriteLine("Hello:"+name);

       }

    }

加上一个有参数的,name。

调用代码

 static void Main(string[] args)

        {

            string s = "Hello World";

            s.Extension();

            s.Extension("Edrick");

            Console.Read();

        }

下面我们看看扩展方法在我们无法获取源代码的dll类中的扩展

新建项目,新建类Person,类里面没有任何代码

namespace Edrick.Liu.People

{

   public class Perosn

    {

       

    }

}

添加引用,添加我们来是扩展类

namespace ExtensionMethod

{

   public static class PersonExtension

    {

       public static void PrPerson(this Perosn p, string firstName,string lastName)

       {

           Console.WriteLine(firstName+","+lastName);

       }

    }

}

调用类

    class Program

    {

        static void Main(string[] args)

        {

            //string s = "Hello World";

            //s.Extension();

            //s.Extension("Edrick");



            Perosn p = new Perosn();

            p.PrPerson("Edrick", "Liu");

            Console.Read();

        }

    }

我们新建一个类Student继承Person,

namespace ExtensionMethod

{

   public class Student:Perosn

    {

       public Student()

       {

           

       }

    }

}

我们在调用Student的时候可以访问到Person的扩展方法

        static void Main(string[] args)

        {

            //string s = "Hello World";

            ////s.Extension();

            ////s.Extension("Edrick");



            //ExtensionString.Extension(s);



            //Perosn p = new Perosn();

            //p.PrPerson("Edrick", "Liu");

            //Console.Read();



            Student student = new Student();

            student.PrPerson("Edrick", "Liu");

            Console.Read();

        }

说明子类可以访问到父类的扩展方法。

个人对扩展方法的建议

1,它反应不了类的真实意图,即一个类想要完成的某个对象功能被拆散分布在多个类文件中,我们在调用扩展类的时候其实是调用的静态类,只是把扩展的类型当做参数传入静态方法中ExtensionString.Extension(s);但是我们本想string完成的功能却在扩展类的代码中。所以,我们在想扩展密封类的时候扩展方法可以起到很好的作用,但是如果类可以继承,个人觉得最好还是继承类。

2,在维护性会有一定的影响,但是不大。

你可能感兴趣的:(方法)