C#扩展方法学习笔记
C#扩展方法,简单的理解是不修改原来类的源代码的情况下,为某个类添加某个方法。扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this修饰符为前缀。
有一个典型的应用场景,就是程序二开。比如别人的DLL不公开源代码,要想在DLL某个类中添加一个新方法的话,是不太可能的。但是可以使用扩展方法,达到类似的目的。
1、新建两个类文件:Rectangle、GenericClass。
/// <summary>
/// 自定义类(长方形)
/// </summary>
public class Rectangle
{
//属性
public double Width { get; set; } = ; //宽度
public double Height { get; set; } = ; //高度 /// <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) * ;
}
}
/// <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(, );
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
C#扩展方法学习笔记的更多相关文章
- C#3.0扩展方法学习篇
什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...
- C#扩展方法学习
扩展方法的本质是什么,详细见此文 C#扩展方法,爱你在心口难开 重点如下:扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法 ...
- C#的扩展方法学习
一,什么是扩展方法? 1,扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 2,扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用 ...
- zepto.1.1.6.js源码中的each方法学习笔记
each方法接受要遍历的对象和对应的回调函数作为参数,它的作用是: 1.如果要遍历的对象是类似数组的形式(以该对象的length属性值的类型是否为number类型来判断),那么就把以要遍历的对象为执行 ...
- Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)
一.学习ArrayList与Map时,关于常用遍历方法的记录如下: 二.附源码如下: package com.study.in.myself; import java.util.ArrayList; ...
- Object.defineProperty()方法学习笔记
这是js中一个非常重要的方法,ES6中某些方法的实现依赖于它,VUE通过它实现双向绑定 此方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象 参数 Object.def ...
- Android Studio调试方法学习笔记
(注:本人所用Android Studio的Keymap已设为Eclipse copy) 1.设置断点 只有设置断点,才好定位要调试什么地方,否则找不到要调试的地方,无法调试.(调试过程中也可以增加断 ...
- JS数组中every(),filter(),forEach(),map(),some()方法学习笔记!
ES5中定义了五种数组的迭代方法:every(),filter(),forEach(),map(),some(). 每个方法都接受两个参数:要在每一项运行的函数(必选)和运行该函数的作用域的对象-影响 ...
- dojo/dom-construct.toDom方法学习笔记
toDom方法用来将html标签字符串转化成DOM节点.1.7之后toDom方法被分配到了dom-construct模块. require(["dojo/dom-construct" ...
随机推荐
- 关于ios沙盒
沙盒下主要有四个文件夹:document,caches,tmp,library document 的路径 程序运行时生成的文件,这个文件不要存比较放大的文件,比如音频,视频类,因为这里的东西会被上传 ...
- gulp+webpack+angular1的一点小经验(第三部分使用一些angular1的插件ui-bootstrap与highcharts)
第一个要介绍的是我们的麻烦制造器:angular-ui-bootstrap ui-bootstrap可以有很多通用的插件给大家用,比如弹窗啊(modal),翻页控件啊(pagination),为什么说 ...
- SwiftyUserDefaults-封装系统本地化的框架推荐
// // ViewController.swift // Test4SwiftyUserDefaults // Copyright © 2017年. All rights reserved. // ...
- 15.Django基础十一之认证系统
一 auth模块 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Django作为一个 ...
- 洛谷 3111 [USACO14DEC]牛慢跑Cow Jog_Sliver 题解
本蒟蒻又来发题解了, 一道较水的模拟题. 题意不过多解释, 思路如下: 在最开始的时候求出每头牛在t秒的位置(最终位置 然后,如果后一头牛追上了前一头牛,那就无视它, 把它们看成一个整体. else ...
- [AHOI2017初中组]guide
题目描述 农场主John最近在网上买了一辆新车,在购买汽车配件时,John不小心点了两次"提交"按钮.导致汽车上安装了两套GPS系统,更糟糕的是John在使用GPS导航时,两套系统 ...
- shell脚本调用python模块
python helloworld.py代码为 # coding:utf-8 from __future__ import print_function import sys print(sys.pa ...
- 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)
目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...
- Kinect-v2 Examples with MS-SDK(译文二)
K2-asset提供的脚本组件 K2-asset在KinectScripts文件夹中提供通用脚本组件,并在KinectDemos / 文件夹的相应脚本子文件夹中提供特定于演示的组件.可以在自己的Uni ...
- redis第一讲【redis的描述,linux和docker下的安装使用】
Redis(REmote DIctionary Server):是什么 redis(远程字典服务器),是完全开源免费的,高性能的k/v分布式内存数据,热门的Nosql数据库 Redis可以干什么: 内 ...