首页 > 代码库 > 学习系列之扩展方法

学习系列之扩展方法

一 扩展方法的定义

     扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异

     从字面上按照我们通常的理解,我们首先需要获得某个类的源代码,然后在这个类代码中增加成员方法,这样就可以达到为一个类提供扩展方法的目的。可是不幸地是,这种方法在没有源代码的情况下就无法奏效了,而且我们人为地去改变源代码有可能会破坏整个代码的稳定性。那么有没有一种方法能在不改变源代码的前提下为某个类提供扩展方法呢?这就是我们今天要说的扩展方法,所以我们可以将扩展方法理解为在不改变源代码的前提下向外部提供扩展方法的一种方式

二 扩展方法的特点

 1、实现扩展方法的类必须是静态类且类的名称和实现扩展方法的类无关

 2、实现扩展方法的类方法必须是静态方法;

 3、实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类

三 代码演示

(一)扩展c#自身存在的类

        我们知道将一个合法字符串类型转换为整型,可以使用int.parse()方法,假如我们希望为string类型扩展一个ToInt方法应该怎么办呢?我们一起来看下面的这段代码:

namespace 扩展方法
{
    /// <summary>
    /// 1、定义一个静态类
    /// 2、静态类的名称和要实现扩展方法的具体类无关
    /// </summary>
    public static class SomeClass
    {
        /// <summary>
        /// 3、实现一个具体的静态方法
        /// </summary>
        /// <param name="str">4、第一个参数必须使用this关键字指定要使用扩展方法的类型</param>
        /// <returns></returns>
        public static int ToInt(this String str)
        {
            return int.Parse(str);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {   
            
            string strOne = "123";
            int num = strOne.ToInt();
            Console.WriteLine(num);
            Console.ReadLine();
        }
    }
}

(二)扩展自定义类

    自身定义一个MyData类,其中包含一个构造函数和一个求三个数字和的方法,如果我们想在此类中添加一个求三个数字平均值的函数,会怎么做?继续在此类中添加?如果这个类是密封的怎么办?那么这个时候我们就可以使用扩展方法对MyData类进行扩展,以方便我们的进一步需求。

class MyData
    {
        public double D1;
        public double D2;
        public double D3;
        public MyData(double d1, double d2, double d3)
        {
            D1 = d1;
            D2 = d2;
            D3 = d3;
        }
        public double sum()
        {
            return D1 + D2 + D3;
        }
    }


    /// <summary>
    /// 扩展MyData类,为此类扩展一个求平均值的方法
    /// </summary>
    static class ExtendMyData
    {
        public static double Average(this MyData md)
        {
            return md.sum() / 3;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyData md = new MyData(3, 4, 5);//调用MyData类中的构造函数为对象md赋值
            Console.WriteLine("和为{0}",md.Average());
            Console.ReadLine();
        }
    }

 

学习系列之扩展方法