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个按钮。
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