C# 扩展方法集
语法注意点
- 可以使用扩展方法来扩展类或接口。
- 不能重写扩展方法。
- 扩展方法只能在非嵌套、非泛型静态类内部定义。
- 扩展方法必须定义在静态类中。
- 扩展方法的第一个参数的类型用于指定被扩展的类型,它限制该扩展方法只能作用于该类型。
- 扩展方法的第一个参数必须带有 "this" 修饰符。
- 调用方必须引入扩展方法的命名空间。
- 调用扩展方法的语法,与调用 "被扩展的类型上的实例方法" 的语法相同。
- 调用扩展方法时,无需传递第一个参数,因为该参数仅用于指定被扩展的类型。
- 扩展方法是一种特殊的静态方法,其调用方式与调用被扩展类型上的实例方法语法相同。
- 仅当使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。
Humanizer(人性化)
Humanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities
string
// Return a string describing the value as a file size.
// For example, 1.23 MB.
public static string ToFileSize(this double value)
{
string[] suffixes = { "bytes", "KB", "MB", "GB",
"TB", "PB", "EB", "ZB", "YB"};
for (int i = 0; i < suffixes.Length; i++)
{
if (value <= (Math.Pow(1024, i + 1)))
{
return ThreeNonZeroDigits(value /
Math.Pow(1024, i)) +
" " + suffixes[i];
}
} return ThreeNonZeroDigits(value /
Math.Pow(1024, suffixes.Length - 1)) +
" " + suffixes[suffixes.Length - 1];
}
// Return the value formatted to include at most three
// non-zero digits and at most two digits after the
// decimal point. Examples:
// 1
// 123
// 12.3
// 1.23
// 0.12
private static string ThreeNonZeroDigits(double value)
{
if (value >= 100)
{
// No digits after the decimal.
return value.ToString("0,0");
}
else if (value >= 10)
{
// One digit after the decimal.
return value.ToString("0.0");
}
else
{
// Two digits after the decimal.
return value.ToString("0.00");
}
}
参考资料
扩展方法 (C# 编程指南) (Entrance on MSDN)
http://msdn.microsoft.com/zh-CN/library/bb383977
http://msdn.microsoft.com/zh-cn/magazine/cc163317.aspx
c# 扩展方法奇思妙用
http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html
Conversion rules for Instance parameters and their impact
http://blogs.msdn.com/b/sreekarc/archive/2007/10/11/consequences-of-conversion-rules-for-instance-parameters.aspx
Extension methods Interoperability between languages
http://blogs.msdn.com/b/sreekarc/archive/2007/10/11/extension-methods-interoperability-between-languages.aspx
开源扩展项目
http://dnpextensions.codeplex.com/
C# 扩展方法集的更多相关文章
- MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集(转)
namespace Entity { public interface IPagedList { /// <summary> /// 记录数 /// </summary> in ...
- Mvc分页:为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集
namespace Entity{ public interface IPagedList { /// <summary> /// 记录数 /// </summary> int ...
- JS方法集
数组方法集 Angela.array = { //# 数组方法 // index, 返回位置! 不存在则返回 -1: index: function (t, arr) { //# 返回当前值所在数组的 ...
- C#高级知识点概要(3) - 特性、自动属性、对象集合初始化器、扩展方法、Lambda表达式和Linq查询
1.特性(Attributes) 特性(Attributes),MSDN的定义是:公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法 ...
- jQuery each、节点操作、动画演示、尺寸操作、扩展方法
一.each 1.方式一:$.each(数组或者自定义对象,function(i,j){console.log(i,j)}) $.each(li,function(i,j){ console.log( ...
- artDialog学习之旅(二)之扩展方法详解
名称 描述 核心方法 art.dialog.top 获取artDialog可用最高层window对象.这与直接使用window.top不同,它能排除artDialog对象不存在已经或者顶层页面为框架集 ...
- 3.4.1 使用过滤式扩展方法(P43-44)
对IEnumerable<T>执行标准并且同样返回IEnumerable<T>的扩展方法,可以使用yield关键字对源数据中的项应用选择标准,已生成精简的结果集. public ...
- jQuery对象扩展方法(Extend)深度解析
1.这几天在写自己的Js工具类库,所以在编写对象扩展方法,参考了jQuery的对象扩展方法,在编写该方法前,需要掌握js深拷贝和浅拷贝的相关知识,下面是jQuery3.2.1版本对象扩展方法的源码: ...
- C#对IQueryable<T>、IEnumerable<T>的扩展方法
#region IQueryable<T>的扩展方法 #region 根据第三方条件是否为真是否执行指定条件的查询 /// <summary> /// 根据第三方条件是否为真是 ...
随机推荐
- C#基础知识五之abstract virtual关键字
abstract 用关键字abstract修饰的类叫做抽象类,且只能作为基类,也不能实例化. 用abstract定义的抽象类中不一定只包含抽象方法 ,可以包含非抽象方法. abstract定义的方法一 ...
- 关于在aspx前台使用后台变量的问题
我们经常会在后台定义一个变量,然后在用<%=变量名%>这种方式去获取,但是有时候<head></head>里面获取变量的时候,有时候会获取不到是怎么回事呢 前台: ...
- .net中创建xml文件的两种方法
.net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...
- Java代码优化(长期更新)
前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...
- Java设计模式之单例模式
很多人都疑惑,单例模式是什么?为什么要用单例模式?在这里,笔者记录的仅仅只是自己对于知识点的理解,如果有错误的,请下方评论指教,共同进步,谢谢. 单例模式是什么? 简单理解: 单例就是一个实例被多个用 ...
- js中constructor和prototype
在最开始学习js的时候,我们在讲到原型链和构造函数的时候经常会有一个例子 如果我们定义函数如下: function Foo() { /* .. */ } Foo.prototype.bar = fun ...
- H5中的touch事件
touch中共有touchstart.touchmove和touchend三个事件: touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结 ...
- 去除GridView选中时的蓝色背景
解决办法: android:listSelector="#00000000" android:listSelector="@android:color/transpare ...
- iOS之设置头像(访问系统相册、本地上传)
1. UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle: ...
- Android中GridView通过自定义适配器(未优化)实现图文视图排列
Android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要显示时,可以使用该组件.下面我们通过代码实现如下图例(为了方便截图,将事件处理(土 ...