分享.NET系统开发过程中积累的扩展方法

 

.NET 3.5提供的扩展方法特性,可以在不修改原类型代码的情况下扩展它的功能。下面分享的这些扩展方法大部分来自于Code Project或是Stackoverflow,.NET为此还有一个专门提供扩展方法的网站(extensionMethod)。

涵盖类型转换,字符串处理,时间转化,集合操作等多个方面的扩展。

1  TolerantCast 匿名类型转换

这个需求来源于界面中使用BackgroundWorker,为了给DoWork传递多个参数,又不想定义一个类型来完成,于是我会用到TolerantCast方法。参考如下的代码:

  1. //创建匿名类型
  2. var parm = new { Bucket = bucket, AuxiliaryAccIsCheck = chbAuxiliaryAcc.Checked, AllAccountIsCheck = chbAllAccount.Checked };
  3. backgroundWorker.RunWorkerAsync(parm);
  4.  
  5. private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
  6. {
  7. //解析转换匿名类型
  8. var parm = e.Argument.TolerantCast(new { Bucket = new RelationPredicateBucket(), AuxiliaryAccIsCheck = false, AllAccountIsCheck = false });

2  ForEach 集合操作

这个方法的定义很简单但也很实用,它的使用方法如下:

  1. var buttons = GetListOfButtons() as IEnumerable<Button>;
  2. buttons.ForEach(b => b.Click());

扩展方法的源代码定义只有一行,源代码如下:

  1. public static void ForEach<T>(this IEnumerable<T> @enum, Action<T> mapFunction)
  2. {
  3. foreach (var item in @enum) mapFunction(item);
  4. }
  1.  

当我想对一个集合中的每个元素执行相同的操作时,常常会借助于此方法实现。

3 Capitalize 字符串首字母大写

直接对字符串操作,将字符串的首字母改成大写,源代码参考如下:

  1. public static string Capitalize(this string word)
  2. {
  3. if (word.Length <= 1)
  4. return word;
  5.  
  6. return word[0].ToString().ToUpper() + word.Substring(1);
  7. }

4  ToDataTable 强类型对象集合转化为DataTable

开发中经常会遇到将List<Entity>转化为DataTable,或是反之将DataTable转化为List<Entity>,stackoverflow上有很多这个需求的代码,参考下面的程序代码:

  1. public static DataTable ToDataTable<T>(this IEnumerable<T> varlist)
  2. {
  3. DataTable dtReturn = new DataTable();
  4.  
  5. // column names
  6. PropertyInfo[] oProps = null;
  7.  
  8. if (varlist == null) return dtReturn;
  9.  
  10. foreach (T rec in varlist)
  11. {
  12. // Use reflection to get property names, to create table, Only first time, others will follow
  13. if (oProps == null)
  14. {
  15. oProps = ((Type) rec.GetType()).GetProperties();
  16. foreach (PropertyInfo pi in oProps)
  17. {
  18. Type colType = pi.PropertyType;
  19.  
  20. if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof (Nullable<>)))
  21. {
  22. colType = colType.GetGenericArguments()[0];
  23. }
  24.  
  25. dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
  26. }
  27. }
  28.  
  29. DataRow dr = dtReturn.NewRow();
  30.  
  31. foreach (PropertyInfo pi in oProps)
  32. {
  33. dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue
  34. (rec, null);
  35. }
  36.  
  37. dtReturn.Rows.Add(dr);
  38. }
  39. return dtReturn;
  40. }

5  SetAllValues 给数组中的每个元素赋值

实现给数组中的每个元素赋相同的值。

  1. public static T[] SetAllValues<T>(this T[] array, T value)
  2. {
  3. for (int i = 0; i < array.Length; i++)
  4. {
  5. array[i] = value;
  6. }
  7.  
  8. return array;
  9. }

6 ToXml 序列化对象为Xml格式

可以将一个对象序列化为Xml格式的字符串,保存对象的状态。

  1. public static string ToXml<T>(this T o) where T : new()
  2. {
  3. string retVal;
  4. using (var ms = new MemoryStream())
  5. {
  6. var xs = new XmlSerializer(typeof (T));
  7. xs.Serialize(ms, o);
  8. ms.Flush();
  9. ms.Position = 0;
  10. var sr = new StreamReader(ms);
  11. retVal = sr.ReadToEnd();
  12. }
  13. return retVal;
  14. }

7  Between 值范围比较

可以判断一个值是否落在区间范围值中。

  1. public static bool Between<T>(this T me, T lower, T upper) where T : IComparable<T>
  2. {
  3. return me.CompareTo(lower) >= 0 && me.CompareTo(upper) < 0;
  4. }

类似这样的操作,下面的方法是取2个值的最大值。

  1. public static T Max<T>(T value1, T value2) where T : IComparable
  2. {
  3. return value1.CompareTo(value2) > 0 ? value1 : value2;
  4. }
  1.  

8  StartDate DueDate 开始值或末值

业务系统中常常会用到时间比较,如果系统是用DateTime.Now变量与DateTime.Today来作比较,前者总是大于后者的,为此需要做一个简单转化,根据需要将值转化为开始值或末值,也就是0点0分0秒,或是23时59分59秒。

  1. public static DateTime ConverToStartDate(this DateTime dateTime)
  2. {
  3. return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 0, 0, 0);
  4. }
  5.  
  6. public static DateTime ConverToDueDate(this DateTime dateTime)
  7. {
  8. return new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, 23, 59, 59);
  9. }
  1.  
  1.  

9 First Day Last Day 月的第一天或是最后一天

  1. public static DateTime First(this DateTime current)
  2. {
  3. DateTime first = current.AddDays(1 - current.Day);
  4. return first;
  5. }
  1. public static DateTime Last(this DateTime current)
  2. {
  3. int daysInMonth = DateTime.DaysInMonth(current.Year, current.Month);
  4.  
  5. DateTime last = current.First().AddDays(daysInMonth - 1);
  6. return last;
  7. }
  1.  
  2.  

10 Percent 百分比值

计算前一个数值占后一个数值的百分比,常用于统计方面。

  1. public static decimal PercentOf(this double position, int total)
  2. {
  3. decimal result = 0;
  4. if (position > 0 && total > 0)
  5. result=(decimal)((decimal)position / (decimal)total * 100);
  6. return result;
  7. }

扩展方法源代码下载:http://files.cnblogs.com/files/JamesLi2015/ExtensionMethod.zip

.NET系统开发过程中积累的扩展方法的更多相关文章

  1. 分享.NET系统开发过程中积累的扩展方法

    .NET 3.5提供的扩展方法特性,可以在不修改原类型代码的情况下扩展它的功能.下面分享的这些扩展方法大部分来自于Code Project或是Stackoverflow,.NET为此还有一个专门提供扩 ...

  2. ASP.NET Core中,UseDeveloperExceptionPage扩展方法会吃掉异常

    在ASP.NET Core中Startup类的Configure方法中,有一个扩展方法叫UseDeveloperExceptionPage,如下所示: // This method gets call ...

  3. C#中this在扩展方法的应用

    给类添加扩展方法 1.定义一个类Service public class Service { private string _name; public string Name { get { retu ...

  4. ABP框架源码中的Linq扩展方法

    文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions ...

  5. ABP源码分析十五:ABP中的实用扩展方法

    类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an   attribu ...

  6. Yii框架中安装srbac扩展方法

    首先,下载srbac_1.3beta.zip文件和对应的blog-srbac_1.2_r228.zip 问什么要下载第二个文件,后面就知道了. 按照手册进行配置: 解压缩srbac_1.3beta.z ...

  7. 【EF学习笔记11】----------查询中常用的扩展方法

    先来看一下我们的表结构: 首先毫无疑问的要创建我们的上下文对象: using (var db = new Entities()) { //执行操作 } Average 平均值: //查询平均分 Con ...

  8. (转)嵌入式linux系统开发过程中遇到的——volatile

    原文地址:http://blog.csdn.net/HumorRat/article/details/5631023 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的.如果系统结构支持 ...

  9. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

随机推荐

  1. Spring、Spring MVC、MyBatis

    Spring.Spring MVC.MyBatis整合文件配置详解 使用SSM框架做了几个小项目了,感觉还不错是时候总结一下了.先总结一下SSM整合的文件配置.其实具体的用法最好还是看官方文档. Sp ...

  2. 使用CMakeLists.txt 判断编译器是否支持C++11

    #将下面的内容添加到CMakeLists.txt当中include(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-std=c++11&quo ...

  3. HTML5_文本元素

    <!DOCTYPE html> <hmtl> <html  lang="zh-en"> <head> <meta  chars ...

  4. 3g自己主动更新网卡驱动web完架构文档

    几年前写. 看它是否是用得上 1  简单介绍 本文档具体描写叙述了基于ASP.NET平台和IIS服务的T-Mobile自己主动更新系统的实现框架. 本文档主要从技术架构和业务架构两个方面来着手来描写叙 ...

  5. WPF下的视频录制界面设计

    原文:WPF下的视频录制界面设计 在去年12月份,我曾经写过三篇文章讨论C#下视频录制.播放界面的设计.这三篇文章是:利用C#画视频录制及播放的界面(一) 利用C#画视频录制及播放的界面(二)利用C# ...

  6. Gradle cookbook(转)

    build.gradle apply plugin:"java" [compileJava,compileTestJava,javadoc]*.options*.encoding ...

  7. Node.js Tools for Visual Studio

    https://www.visualstudio.com/en-us/features/node-js-vs.aspx

  8. 计时器 Timer

    计时器 Timer 不多说了,守则.

  9. liunx tomcat多站点配置

    <Host name="nav" debug="0" appBase="webapps"  unpackWARs="true ...

  10. 【Java基础】选择排序、冒泡法排序、二分法查找

    1.选择排序: //改进后的选择排序,减少交换的次数 public static void sortSelect(int arr[]) { //用于存放最小数的下标 int s; for (int i ...