扩展方法

    这篇谈谈扩展方法,顾名思义,扩展即对某一个事物进行增加,或者增加一些功能。那扩展方法呢?比如我们现在有一个类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,在维护性会有一定的影响,但是不大。

posted @ 2011-10-17 04:50  刘中栋  阅读(254)  评论(1)    收藏  举报