扩展方法

本文详细介绍了C#中的扩展方法,包括如何定义扩展方法、如何使用它们为现有的密封类添加新功能,以及如何为无法获取源代码的类添加扩展方法。此外,还探讨了扩展方法在继承情况下的行为及使用建议。

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

转载于:https://www.cnblogs.com/ColeLiu/archive/2011/10/17/2214530.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值