.NET系统开发过程中积累的扩展方法
分享.NET系统开发过程中积累的扩展方法
.NET 3.5提供的扩展方法特性,可以在不修改原类型代码的情况下扩展它的功能。下面分享的这些扩展方法大部分来自于Code Project或是Stackoverflow,.NET为此还有一个专门提供扩展方法的网站(extensionMethod)。
涵盖类型转换,字符串处理,时间转化,集合操作等多个方面的扩展。
1 TolerantCast 匿名类型转换
这个需求来源于界面中使用BackgroundWorker,为了给DoWork传递多个参数,又不想定义一个类型来完成,于是我会用到TolerantCast方法。参考如下的代码:
- //创建匿名类型
- var parm = new { Bucket = bucket, AuxiliaryAccIsCheck = chbAuxiliaryAcc.Checked, AllAccountIsCheck = chbAllAccount.Checked };
- backgroundWorker.RunWorkerAsync(parm);
- private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
- {
- //解析转换匿名类型
- var parm = e.Argument.TolerantCast(new { Bucket = new RelationPredicateBucket(), AuxiliaryAccIsCheck = false, AllAccountIsCheck = false });
2 ForEach 集合操作
这个方法的定义很简单但也很实用,它的使用方法如下:
- var buttons = GetListOfButtons() as IEnumerable<Button>;
- buttons.ForEach(b => b.Click());
扩展方法的源代码定义只有一行,源代码如下:
- public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction)
- {
- foreach (var item in @enum) mapFunction(item);
- }
当我想对一个集合中的每个元素执行相同的操作时,常常会借助于此方法实现。
3 Capitalize 字符串首字母大写
直接对字符串操作,将字符串的首字母改成大写,源代码参考如下:
- public static string Capitalize(this string word)
- {
- if (word.Length <= 1)
- return word;
- return word[0].ToString().ToUpper() + word.Substring(1);
- }
4 ToDataTable 强类型对象集合转化为DataTable
开发中经常会遇到将List<Entity>转化为DataTable,或是反之将DataTable转化为List<Entity>,stackoverflow上有很多这个需求的代码,参考下面的程序代码:
- public static DataTable ToDataTable<T>(this IEnumerable<T> varlist)
- {
- DataTable dtReturn = new DataTable();
- // column names
- PropertyInfo[] oProps = null;
- if (varlist == null) return dtReturn;
- foreach (T rec in varlist)
- {
- // Use reflection to get property names, to create table, Only first time, others will follow
- if (oProps == null)
- {
- oProps = ((Type) rec.GetType()).GetProperties();
- foreach (PropertyInfo pi in oProps)
- {
- Type colType = pi.PropertyType;
- if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof (Nullable<>)))
- {
- colType = colType.GetGenericArguments()[0];
- }
- dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
- }
- }
- DataRow dr = dtReturn.NewRow();
- foreach (PropertyInfo pi in oProps)
- {
- dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
- (rec, null);
- }
- dtReturn.Rows.Add(dr);
- }
- return dtReturn;
- }
5 SetAllValues 给数组中的每个元素赋值
实现给数组中的每个元素赋相同的值。
- public static T[] SetAllValues<T>(this T[] array, T value)
- {
- for (int i = 0; i < array.Length; i++)
- {
- array[i] = value;
- }
- return array;
- }
6 ToXml 序列化对象为Xml格式
可以将一个对象序列化为Xml格式的字符串,保存对象的状态。
- public static string ToXml<T>(this T o) where T : new()
- {
- string retVal;
- using (var ms = new MemoryStream())
- {
- var xs = new XmlSerializer(typeof (T));
- xs.Serialize(ms, o);
- ms.Flush();
- ms.Position = 0;
- var sr = new StreamReader(ms);
- retVal = sr.ReadToEnd();
- }
- return retVal;
- }
7 Between 值范围比较
可以判断一个值是否落在区间范围值中。
- public static bool Between<T>(this T me, T lower, T upper) where T : IComparable<T>
- {
- return me.CompareTo(lower) >= 0 && me.CompareTo(upper) < 0;
- }
类似这样的操作,下面的方法是取2个值的最大值。
- public static T Max<T>(T value1, T value2) where T : IComparable
- {
- return value1.CompareTo(value2) > 0 ? value1 : value2;
- }
8 StartDate DueDate 开始值或末值
业务系统中常常会用到时间比较,如果系统是用DateTime.Now变量与DateTime.Today来作比较,前者总是大于后者的,为此需要做一个简单转化,根据需要将值转化为开始值或末值,也就是0点0分0秒,或是23时59分59秒。
- public static DateTime ConverToStartDate(this DateTime dateTime)
- {
- return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0);
- }
- public static DateTime ConverToDueDate(this DateTime dateTime)
- {
- return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
- }
9 First Day Last Day 月的第一天或是最后一天
- public static DateTime First(this DateTime current)
- {
- DateTime first = current.AddDays(1 - current.Day);
- return first;
- }
- public static DateTime Last(this DateTime current)
- {
- int daysInMonth = DateTime.DaysInMonth(current.Year, current.Month);
- DateTime last = current.First().AddDays(daysInMonth - 1);
- return last;
- }
10 Percent 百分比值
计算前一个数值占后一个数值的百分比,常用于统计方面。
- public static decimal PercentOf(this double position, int total)
- {
- decimal result = 0;
- if (position > 0 && total > 0)
- result=(decimal)((decimal)position / (decimal)total * 100);
- return result;
- }
扩展方法源代码下载:http://files.cnblogs.com/files/JamesLi2015/ExtensionMethod.zip
.NET系统开发过程中积累的扩展方法的更多相关文章
- 分享.NET系统开发过程中积累的扩展方法
.NET 3.5提供的扩展方法特性,可以在不修改原类型代码的情况下扩展它的功能.下面分享的这些扩展方法大部分来自于Code Project或是Stackoverflow,.NET为此还有一个专门提供扩 ...
- ASP.NET Core中,UseDeveloperExceptionPage扩展方法会吃掉异常
在ASP.NET Core中Startup类的Configure方法中,有一个扩展方法叫UseDeveloperExceptionPage,如下所示: // This method gets call ...
- C#中this在扩展方法的应用
给类添加扩展方法 1.定义一个类Service public class Service { private string _name; public string Name { get { retu ...
- ABP框架源码中的Linq扩展方法
文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...
- ABP源码分析十五:ABP中的实用扩展方法
类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attribu ...
- Yii框架中安装srbac扩展方法
首先,下载srbac_1.3beta.zip文件和对应的blog-srbac_1.2_r228.zip 问什么要下载第二个文件,后面就知道了. 按照手册进行配置: 解压缩srbac_1.3beta.z ...
- 【EF学习笔记11】----------查询中常用的扩展方法
先来看一下我们的表结构: 首先毫无疑问的要创建我们的上下文对象: using (var db = new Entities()) { //执行操作 } Average 平均值: //查询平均分 Con ...
- (转)嵌入式linux系统开发过程中遇到的——volatile
原文地址:http://blog.csdn.net/HumorRat/article/details/5631023 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
随机推荐
- Spring、Spring MVC、MyBatis
Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Sp ...
- 使用CMakeLists.txt 判断编译器是否支持C++11
#将下面的内容添加到CMakeLists.txt当中include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11&quo ...
- HTML5_文本元素
<!DOCTYPE html> <hmtl> <html lang="zh-en"> <head> <meta chars ...
- 3g自己主动更新网卡驱动web完架构文档
几年前写. 看它是否是用得上 1 简单介绍 本文档具体描写叙述了基于ASP.NET平台和IIS服务的T-Mobile自己主动更新系统的实现框架. 本文档主要从技术架构和业务架构两个方面来着手来描写叙 ...
- WPF下的视频录制界面设计
原文:WPF下的视频录制界面设计 在去年12月份,我曾经写过三篇文章讨论C#下视频录制.播放界面的设计.这三篇文章是:利用C#画视频录制及播放的界面(一) 利用C#画视频录制及播放的界面(二)利用C# ...
- Gradle cookbook(转)
build.gradle apply plugin:"java" [compileJava,compileTestJava,javadoc]*.options*.encoding ...
- Node.js Tools for Visual Studio
https://www.visualstudio.com/en-us/features/node-js-vs.aspx
- 计时器 Timer
计时器 Timer 不多说了,守则.
- liunx tomcat多站点配置
<Host name="nav" debug="0" appBase="webapps" unpackWARs="true ...
- 【Java基础】选择排序、冒泡法排序、二分法查找
1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...