阅读更多

0顶
0踩

编程语言
.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

来自:James Li
来自: James Li
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 人工智能时代,软件工程师们将会被取代?

    我相信人工智能将产生类似工业革命这种效果,人类的生产力得到极大解放。短期来看,人工智能只是辅助我们工作的工具,作为软件工程师需要利用好工具,需要做好持续学习甚至终身学习的准备,需要从繁琐重复的工作中...

  • 程序员的成长课

    要了解这一点,可以去看各种薪酬报告,如100 offer 每个季度都会有类似的报告出来,拉勾网也会发布互联网职场生态白皮书,你用“互联网人才流动报告”“开发者薪酬报告”或者“互联网薪资调查”为关键字搜索,能搜到...

  • IT 行业的创新 - 创新的迷思 (7-8)

    通用公司的杰克·韦尔奇也谈到过类似的例子, 已有的销售团队往往不愿意推广颠覆性的新产品, 因为市场没打开, 利润率低。 韦尔奇往往组建新的团队来推销,或者把这些利润单独核算。 另一个例子: 作为一个小公司, ...

  • 单片机应用编程技巧

    最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路...

  • 走向.NET架构设计--第一章:走向设计

    这个过程就好比买衣服:在买衣服的时候,不是从个人的身型和喜好出发,而是先看衣服,然后用衣服来 ” 套 ” 人,难免让人不舒服。    什么是设计  前面闲话了 N 多,来看看什么是设计。有一点,我想有...

  • 单片机学习和应用百问大全

    最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路...

  • 单片机应用编程技巧100问

    加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不 稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路正常动作所致。 为了避免上述问题除了设法分割两电路block之外,设计电路板...

  • 修炼一名程序员的职业水准

    如果你走到这一步,在你工作的团队中,已经是经常有人向你请教技术问题,经常有人请求你帮忙debug,你已是公认的"高手"了,别得意,因为你仍然是个Coder,为什么这么说呢,你想想,你已深入了解了这个开发环境中的...

  • 单片机应用编程技巧---MCU专家答网友问

    最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路...

  • Book01--代码整洁之道:程序员的职业素养

    有效的学习方法是向高手请教而不是从零开始。 专业人士结对工作,还因为这是分享知识的最好途径。专业人士并不会仅凭一己之力从零开始创建知识,而是通过互相结对来学习系统的不同部分和业务。他们明白,尽管每位...

  • 一起谈.NET技术,走向ASP.NET架构设计——第一章:走向设计

    这个过程就好比买衣服:在买衣服的时候,不是从个人的身型和喜好出发,而是先看衣服,然后用衣服来”套”人,难免让人不舒服。   什么是设计  前面闲话了N多,来看看什么是设计。有一点,我想有一点大家是认同...

  • 【关于单片机的N多问题】关于单片机的N多问题

    最近几年高频电路与数位电路共享相同电路板,构成所谓的混载电路系统似乎有增加的趋势,类似如此的设计经常会造成数位电路动作时,高频电路却发生动作不稳定等现象,其中原因之一是数位电路产生的噪讯,影响高频电路...

  • 基于主从博弈的共享储能与综合能源微网优化运行研究:MATLAB与CPLEX实现

    内容概要:本文详细探讨了在主从博弈框架下,共享储能与综合能源微网的优化运行及其仿真复现。通过MATLAB和CPLEX的联合使用,展示了微网运营商和用户聚合商之间的动态博弈过程。上层模型关注微网运营商的定价策略,旨在最大化利润,考虑售电收益、储能运维成本等因素。下层模型则聚焦于用户聚合商的响应,根据电价调整电热负荷并参与共享储能调度。文中还介绍了电热耦合约束、充放电互斥约束等关键技术细节,并通过迭代博弈实现了策略更新。最终仿真结果显示,在引入电制热设备后,用户侧热负荷弹性提升,博弈收敛速度加快,达到双赢效果。 适合人群:从事能源系统优化、博弈论应用、MATLAB编程的研究人员和技术人员。 使用场景及目标:适用于希望深入了解主从博弈在综合能源系统中应用的学者和工程师。目标是掌握如何通过数学建模和编程实现复杂的能源系统优化,理解电热耦合机制和共享储能的作用。 其他说明:文章提供了详细的代码片段和仿真结果,帮助读者更好地理解和复现实验。此外,还讨论了一些常见的调试问题和解决方案,如约束冲突等。

  • 【基于矢量射线的衍射积分 (VRBDI)】基于矢量射线的衍射积分 (VRBDI) 和仿真工具附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

  • 【深度学习应用综述】多领域关键技术及应用场景汇总:从计算机视觉到金融风控的全面解析

    内容概要:深度学习在多个领域有着广泛应用。在计算机视觉方面,涵盖图像分类、目标检测、图像分割等任务,应用于自动驾驶、医疗影像分析等领域;在自然语言处理上,包括机器翻译、文本分类、文本生成等功能,服务于信息检索、内容创作等;语音识别与合成领域,实现了语音到文本的转换以及文本到语音的生成,推动了智能交互的发展;医疗领域,深度学习助力医学影像分析、疾病预测、个性化治疗及健康监测;金融领域,深度学习用于信用风险评估、欺诈检测、高频交易等,保障金融安全并优化投资策略;自动驾驶方面,环境感知与决策控制系统确保车辆安全行驶;娱乐与媒体领域,个性化推荐和内容生成提升了用户体验;工业与制造业中,质量检测和预测性维护提高了生产效率和产品质量。 适合人群:对深度学习及其应用感兴趣的初学者、研究人员以及相关领域的从业者。 使用场景及目标:帮助读者全面了解深度学习在不同行业的具体应用场景,明确各领域中深度学习解决的实际问题,为后续深入研究或项目实施提供方向指引。 其他说明:随着深度学习技术的持续进步,其应用范围也在不断扩大,文中提及的应用实例仅为当前主要成果展示,未来还有更多潜力待挖掘。

  • 【ARIMA-LSTM】合差分自回归移动平均方法-长短期记忆神经网络研究附Python代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

  • 周梁伟-大模型在融合通信中的应用实践.pdf

    周梁伟-大模型在融合通信中的应用实践

  • 基于S7-200 PLC与组态王的花式喷泉控制系统设计及应用

    内容概要:本文详细介绍了利用西门子S7-200 PLC和组态王软件构建的一个花式喷泉控制系统的设计与实现。首先阐述了系统的硬件组成,包括三个环形喷泉组、七彩LED灯带以及功放喇叭等组件,并给出了详细的IO分配表。接着深入解析了关键的梯形图程序逻辑,如自动模式循环、灯光控制、喷泉舞步等部分的具体实现方法。此外,还分享了一些实际调试过程中遇到的问题及其解决方案,例如电源隔离、电磁干扰处理等。最后展示了组态王界面上生动有趣的动画效果设计思路。 适合人群:对PLC编程和工业自动化感兴趣的工程师和技术爱好者。 使用场景及目标:适用于需要设计类似互动娱乐设施的专业人士,旨在帮助他们掌握从硬件选型、程序编写到界面美化的完整流程,从而能够独立完成类似的工程项目。 其他说明:文中不仅提供了理论知识讲解,还包括了许多实践经验教训,对于初学者来说非常有价值。同时,作者还在系统中加入了一些趣味性的元素,如隐藏模式等,增加了项目的吸引力。

  • 基于COMSOL的电弧熔池多物理场耦合仿真技术详解

    内容概要:本文详细介绍了利用COMSOL进行电弧熔池多物理场耦合仿真的方法和技术要点。首先解释了电弧熔池的本质及其复杂性,然后依次讲解了几何建模、材料属性设置、求解器配置以及后处理等方面的具体步骤和注意事项。文中提供了大量实用的MATLAB、Java和Python代码片段,帮助用户更好地理解和应用相关技术。此外,作者分享了许多实践经验,如分阶段激活物理场、使用光滑过渡函数处理相变、优化网格划分等,强调了参数选择和边界条件设定的重要性。 适合人群:从事电弧熔池仿真研究的专业人士,尤其是有一定COMSOL使用经验的研究人员。 使用场景及目标:适用于需要精确模拟电弧熔池行为的研究项目,旨在提高仿真精度并减少计算时间。主要目标是掌握多物理场耦合仿真的关键技术,解决实际工程中遇到的问题。 其他说明:文章不仅提供了详细的理论指导,还包括许多实用的操作技巧和常见错误的解决方案,有助于读者快速上手并深入理解电弧熔池仿真的难点和重点。

Global site tag (gtag.js) - Google Analytics