欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#扩展方法学习笔记

程序员文章站 2023-04-04 14:54:38
C#扩展方法,简单的理解是不修改原来类的源代码的情况下,为某个类添加某个方法。扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this修饰符为前缀。 有一个典型的应用场景,就是程序二开。比如别人的DLL不公开源代码,要想在DLL某 ......

    c#扩展方法,简单的理解是不修改原来类的源代码的情况下,为某个类添加某个方法。扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this修饰符为前缀。

    有一个典型的应用场景,就是程序二开。比如别人的dll不公开源代码,要想在dll某个类中添加一个新方法的话,是不太可能的。但是可以使用扩展方法,达到类似的目的。

    1、新建两个类文件:rectangle、genericclass。

    /// <summary>
    /// 自定义类(长方形)
    /// </summary>
    public class rectangle
    {
        //属性
        public double width { get; set; } = 0;  //宽度
        public double height { get; set; } = 0; //高度

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="width"></param>
        /// <param name="height"></param>
        public rectangle (double width,double height)
        {
            width = width;
            height = height;
        }

        /// <summary>
        /// 求周长
        /// </summary>
        /// <returns></returns>
        public double getperimeter()
        {
            return (width + height) * 2;
        }
    }
    /// <summary>
    /// 泛型类
    /// </summary>
    /// <typeparam name="t"></typeparam>
    public class genericclass<t>
    {
        private t tobj;

        public genericclass(t obj)
        {
            tobj = obj;
        }

        public t getobject()
        {
            return tobj;
        }
    }

    2、新建一个winform程序,添加3个按钮。

C#扩展方法学习笔记

    3、下面就原生类string、自定义类、泛型类三种类进行扩展方法。新建一个类,命名为:extensionhelper。

    /// <summary>
    /// 类必须是静态类,方法必须为public static类型,且参数使用this关键字。
    /// </summary>
    public static class extensionhelper
    {
        /// <summary>
        /// 原生类string扩展方法
        /// </summary>
        /// <param name="str"></param>
        public static void sayhello(this string str)
        {
            if (string.isnullorempty(str))
            {
                messagebox.show("hello world.", "提示", messageboxbuttons.ok, messageboxicon.information);
            }
            else
            {
                messagebox.show(str, "提示", messageboxbuttons.ok, messageboxicon.information);
            }
        }

        /// <summary>
        /// 自定义类扩展方法
        /// </summary>
        /// <param name="rect"></param>
        /// <returns></returns>
        public static double getarea(this rectangle rect)
        {
            return rect.width * rect.height;
        }

        /// <summary>
        /// 泛型类扩展方法
        /// </summary>
        /// <param name="gc"></param>
        /// <returns></returns>
        public static string show (this genericclass<string> gc)
        {
            return gc.getobject().tostring();
        }
    }

    4、winform代码如下:

        /// <summary>
        /// 原生类string扩展
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_click(object sender, eventargs e)
        {
            string str = "";
            //string str = "welcom to china.";
            str.sayhello();
        }

        /// <summary>
        /// 自定义类扩展
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_click(object sender, eventargs e)
        {
            rectangle rect = new rectangle(10, 10);
            messagebox.show("长方形的面积是:" + rect.getarea().tostring(), "提示", messageboxbuttons.ok, messageboxicon.information);
        }

        /// <summary>
        /// 泛型类扩展
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_click(object sender, eventargs e)
        {
            genericclass<string> gc = new genericclass<string>("这是一个泛型类扩展方法。");
            messagebox.show(gc.show(), "提示", messageboxbuttons.ok, messageboxicon.information);
        }

    参考自:https://www.cnblogs.com/forever-ys/p/10315830.html