突然想起来几年前我写的 !

如何用js实现发布了多久的时间描述:几分钟前,几小时前,几天前,几个月前,几年前 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <script> function getTs(time){ var arr = time.split(/[- :]/), _date = new Date(arr[0], arr[1]-1, 阅读详情

突然想起来几年前我写的一个小东西,放上来大家评论一下,有兴趣的可以测试一下性能,呵呵。

 

原理很简单,利用 Lambda 表达式树生成一个 Delegate ,然后缓存起来。不多说了,下面上代码:

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using Lenic.Extensions;
 
namespace Lenic.Data.Extensions
{
/// <summary>
/// IDataReader 扩展方法集合
/// </summary>
[DebuggerStepThrough]
public static class DataReaderExtensions
{
#region Private Methods
private static readonly Dictionary<Type, Delegate> cache = new Dictionary<Type, Delegate>();
private static readonly object cacheLocker = new object();
#endregion
 
#region Business Methods
/// <summary>
/// 返回指定字段的值, 并执行 ConvertTo 函数转换。
/// </summary>
/// <typeparam name="T">返回值类型。</typeparam>
/// <param name="reader">一个实现了 IDataReader 接口的实例对象。</param>
/// <param name="name">要查找的字段的名称。</param>
/// <returns>转换完毕的 T 类型的结果。</returns>
public static T Field<T>(this IDataReader reader, string name)
{
return reader[name].ConvertTo<T>(default(T), false);
}
 
/// <summary>
/// 返回指定字段的值, 并执行 ConvertTo 函数转换。
/// </summary>
/// <typeparam name="T">返回值类型。</typeparam>
/// <param name="reader">一个实现了 IDataReader 接口的实例对象。</param>
/// <param name="index">要查找的字段的索引。</param>
/// <returns>转换完毕的 T 类型的结果。</returns>
public static T Field<T>(this IDataReader reader, int index)
{
return reader[index].ConvertTo<T>(default(T), false);
}
 
/// <summary>
/// 解析当前 IDataReader 类型的实例对象并提取一个 T 类型的列表。
/// </summary>
/// <typeparam name="T">待解析的元素类型, 该类型必须包含一个默认的构造函数。</typeparam>
/// <param name="reader">一个实现了 IDataReader 接口的实例对象。</param>
/// <returns>一个 T 类型的列表。</returns>
public static List<T> ToList<T>(this IDataReader reader) where T : class, new()
{
return Fill<T>(reader, DynamicCreateEntity<T>()).ToList();
}
 
/// <summary>
/// 解析当前 IDataReader 类型的实例对象并提取一个 T 类型的列表。
/// </summary>
/// <typeparam name="T">待解析的元素类型, 该类型必须包含一个默认的构造函数。</typeparam>
/// <param name="reader">一个实现了 IDataReader 接口的实例对象。</param>
/// <param name="predicate">映射委托。</param>
/// <returns>一个 T 类型的列表。</returns>
public static List<T> ToList<T>(this IDataReader reader, Func<IDataReader, T> predicate)
where T : class, new()
{
return Fill<T>(reader, predicate).ToList();
}
#endregion
 
#region Private Methods
/// <summary>
/// 创建一个 构造函数 委托。
/// </summary>
/// <typeparam name="T">构造目标类型。</typeparam>
/// <returns>构造完毕的 Func 委托。</returns>
private static Func<IDataReader, T> DynamicCreateEntity<T>() where T : class, new()
{
var type = typeof(T);
if (cache.ContainsKey(type))
return (Func<IDataReader, T>)cache[type];
 
lock (cacheLocker)
{
if (cache.ContainsKey(type))
return (Func<IDataReader, T>)cache[type];
 
var result = DynamicCreateEntityLogic<T>();
cache.Add(type, result);
return result;
}
}
 
/// <summary>
/// 创建一个 构造函数 委托(逻辑实现)。
/// </summary>
/// <typeparam name="T">构造目标类型。</typeparam>
/// <returns>构造完毕的 Func 委托。</returns>
private static Func<IDataReader, T> DynamicCreateEntityLogic<T>() where T : class, new()
{
// Compiles a delegate of the form (IDataReader r) => new T { Prop1 = r.Field<Prop1Type>("Prop1"), ... }
ParameterExpression r = Expression.Parameter(typeof(IDataReader), "r");
 
// Get Properties of the property can read and write
var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.CanRead && p.CanWrite)
.ToArray();
 
// Create property bindings for all writable properties
List<MemberBinding> bindings = new List<MemberBinding>(props.Length);
 
// Get the binding method
var method = typeof(DataReaderExtensions).GetMethods()
.First(p => p.Name == "Field" &&
p.GetParameters().Length == 2 &&
p.GetParameters()[1].ParameterType == typeof(string));
 
foreach (PropertyInfo property in (typeof(T).GetProperties()))
{
// Create expression representing r.Field<property.PropertyType>(property.Name)
MethodCallExpression propertyValue = Expression.Call(
method.MakeGenericMethod(property.PropertyType),
r, Expression.Constant(property.Name));
 
// Assign the property value to property through a member binding
MemberBinding binding = Expression.Bind(property, propertyValue);
bindings.Add(binding);
}
// Create the initializer, which instantiates an instance of T and sets property values
 
// using the member bindings we just created
Expression initializer = Expression.MemberInit(Expression.New(typeof(T)), bindings);
 
// Create the lambda expression, which represents the complete delegate (r => initializer)
Expression<Func<IDataReader, T>> lambda = Expression.Lambda<Func<IDataReader, T>>(initializer, r);
 
return lambda.Compile();
}
 
/// <summary>
/// 从一个 IDataReader 的实例对象中提取一个 T 类型的列表。
/// </summary>
/// <typeparam name="T">结果列表中的元素类型, 该类型必须包含一个默认的构造函数。</typeparam>
/// <param name="reader">一个实现了 IDataReader 接口的实例对象。</param>
/// <returns>一个 T 类型的列表。</returns>
private static IEnumerable<T> Fill<T>(IDataReader reader, Func<IDataReader, T> predicate) where T : class, new()
{
while (reader.Read())
yield return predicate(reader);
}
#endregion
}
}

 

上面用到了一个全能转换方法,代码如下:

#region Type Convert Extensions
private static string typeIConvertibleFullName = typeof(IConvertible).FullName;
 
/// <summary>
/// 将当前实例对象类型转换为 T 类型.
/// </summary>
/// <typeparam name="T">目标类型.</typeparam>
/// <param name="obj">当前实例.</param>
/// <returns>转换完成的 T 类型的一个实例对象.</returns>
public static T ConvertTo<T>(this object obj)
{
return ConvertTo(obj, default(T));
}
 
/// <summary>
/// 将当前实例对象类型转换为 T 类型.
/// </summary>
/// <typeparam name="T">目标类型.</typeparam>
/// <param name="obj">当前实例.</param>
/// <param name="defaultValue">转换失败时的返回值.</param>
/// <returns>转换完成的 T 类型的一个实例对象.</returns>
public static T ConvertTo<T>(this object obj, T defaultValue)
{
if (obj != null)
{
if (obj is T)
return (T)obj;
 
var sourceType = obj.GetType();
var targetType = typeof(T);
 
if (targetType.IsEnum)
return (T)Enum.Parse(targetType, obj.ToString(), true);
 
if (sourceType.GetInterface(typeIConvertibleFullName) != null &&
targetType.GetInterface(typeIConvertibleFullName) != null)
return (T)Convert.ChangeType(obj, targetType);
 
var converter = TypeDescriptor.GetConverter(obj);
if (converter != null && converter.CanConvertTo(targetType))
return (T)converter.ConvertTo(obj, targetType);
 
converter = TypeDescriptor.GetConverter(targetType);
if (converter != null && converter.CanConvertFrom(sourceType))
return (T)converter.ConvertFrom(obj);
 
throw new ApplicationException("convert error.");
}
throw new ArgumentNullException("obj");
}
 
/// <summary>
/// 将当前实例对象类型转换为 T 类型.
/// </summary>
/// <typeparam name="T">目标类型.</typeparam>
/// <param name="obj">当前实例.</param>
/// <param name="defaultValue">转换失败时的返回值.</param>
/// <param name="ignoreException">如果设置为 <c>true</c> 表示忽略异常信息, 直接返回缺省值.</param>
/// <returns>转换完成的 T 类型的一个实例对象.</returns>
public static T ConvertTo<T>(this object obj, T defaultValue, bool ignoreException)
{
if (ignoreException)
{
try
{
return obj.ConvertTo<T>(defaultValue);
}
catch
{
return defaultValue;
}
}
return obj.ConvertTo<T>(defaultValue);
}
#endregion

 

再次欢迎大家品鉴。java 培训

电力系统实时仿真技术:从硬件在环到主流平台实践 实时仿真是一种基于高性能计算硬件,在严格时间约束下模拟物理系统动态行为的关键技术。其核心原理在于通过硬实时计算,确保仿真步长内的模型求解与输出时间严格同步,从而构建高保真的虚拟测试环境。这项技术的核心价值在于为电力电子、新能源并网等复杂系统的研发提供了无风险的“数字沙盘”,能够安全地验证控制器逻辑、保护装置动作及系统稳定性。在工程实践中,硬件在环测试通过连接虚拟模型与真实硬件,形成了控制器硬件在环和功率硬件在环两大主流应用场景,广泛应用于设备研发、电网安全分析和人员培训。本文聚焦于电力系统领域,深入解析了实 阅读详情

相关推荐

SAP Ariba Procurement_Catalogs

SAP Ariba Procurement_Catalogs Search Functionality PunchOut Catalogs Spot Buy catalog

CZxx1的博客 1013

几年前删除的照片如何恢复?5步操作,快速找回iPhone照片

随着时间的流逝,我们的苹果手机存储了大量珍贵的回忆,而有时候,我们可能会意外地删除了一些早年的照片,让我们感到遗憾和失落。本文将探究几年前删除的照片如何恢复,为您提供解决方案。

shujuwa123的博客 5040

智能座舱测试工程师必看:从零搭建自动化测试框架的5个实战技巧

本文为智能座舱测试工程师提供从零搭建自动化测试框架的5个实战技巧,涵盖环境搭建、ADB高级应用、Python脚本工程化、Monkey测试优化及性能调优。通过ADB深度操作和Python脚本封装,帮助测试人员构建高可复用的智能座舱测试解决方案,显著提升测试效率与问题发现率。

python9snake的博客 634

几年前写的一个小工具

有一次,有一个很急迫的任务,国家领导要视察一个市的信息化平台。我们作为HIS厂商需要提供大量的数据, 数据定义的PDF文档超过了400页,各种数据超过了70种。他就发动他们部门的人,给俺写了大量的视图、存储过程,俺只要一个一个的封装接口就OK。下面的这个工具就是给他开发的,他会把需求提炼的非常到位,而且尽可能的简化流程,开发起来非常的顺畅。数据复制后,点击日期单元格,修改日期,然后点击“保存”按钮。在单元格中输入0-4的数字,按回车键,跳到下一行。输入完成后,点击上方的“保存”按钮,进行保存。

withcsharp2的博客 509

Temporal Anti-Aliasing(时域抗锯齿TAA)

首先说一下走样:一般分为时域走样(如旋转车轮)和空域走样(锯齿),但在 TAA 技术是采用时域相关叠加混合技术来解决空域走样的问题。 简单看一下空域抗锯齿 (Spatial Anti-Aliasing, SAA)相关技术,最普及的莫过于 MSAA,被各大渲染引擎采用,但是 MSAA 并不适用于延迟渲染 (Deferred Rendering),随之出现了很多基于形态学的后处理抗锯齿技术,如 MLAA,FXAA,SMAA 等(具体看参见图形_反走样技术总结相关介绍),虽然他们表现良好且支持延迟渲染,但是都会面

qq_35312463的博客 1万+

SAP_SD模块信用管理-最早未清项判断逾期

在 SAP SD 模块的信用管理(Credit Management) 中,系统可以通过 最早未清项(Oldest Open Item) 来判断客户是否存在逾期,从而影响订单的信用检查结果。例如: 定义最大未清项目%为1%,未清天数为1天,即允许客户“逾期1天的未清应收帐款/该客户的应收帐款余额”最大比例为1%,若超过1%则将被信用冻结。的信用检查功能,用于判断客户是否有账龄过长的未清款项,并据此决定是否允许新的销售订单继续处理。然后在查看客户的信贷信息可以看到,最早的未清信息显示在系统中。

我小时候很黑的博客 863

雷军22年前写的代码 你见过吗?

作为小米科技的创始人、董事长和首席执行官,雷军的名字如雷贯耳。网上出现一篇“刘强东的代码水平如何”的文章,有网友在下面回复“代码只服雷军”。这个回复吸引了小编的注意,雷军的代码水平真的很牛吗?   原来雷军年轻的时候,也是一名程序员,而且一干就是10年。雷军在22年前的作文中写道:我会当一辈子程序员,由此可以看出雷军对编程有着狂热的爱好。   还有网友分享了一篇雷军22年前写的代码,废话不...

优快云头条 3万+

一次携程酒店 phantom-token 逆向实战复盘(附python纯算)

摘要 本文介绍了通过分析携程酒店列表页面的数据接口,使用Python实现抓取的方法。主要内容包括: 目标站点为携程酒店列表页,通过开发者工具发现关键接口fetchHotelList 将浏览器请求转换为Python代码,包含请求头(headers)、Cookies和POST数据 提供完整的请求示例代码,包含日期参数、城市ID等必要信息 特别声明仅供学习交流使用,禁止商业用途 展示了如何获取酒店列表数据,包括排序筛选等参数设置 该方法可用于研究酒店数据采集,但需要注意遵守网站使用条款。

自成背后的博客 3023

ESP32固件一键烧录包:解决数据边界与分区表问题

嵌入式开发中,固件烧录看似基础,却常因环境配置、参数错误和镜像分区问题而频频受阻。ESP32等芯片的固件并非单一bin文件,而是由引导加载器、分区表和应用固件组成的完整镜像,各部分必须放置在正确的Flash地址和分区边界内。通过esptool的merge_bin命令将多文件合成整包,并从地址、分区容量和总容量三个维度严格校验数据边界,可大幅降低变砖风险。进一步将Python环境、esptool、固件和批处理脚本封装为Windows一键烧录包,让测试、生产和客户交付场景中的非技术用户也能安全完成烧录,真正实现

weixin_34323858的博客 349

MATLAB基础应用精讲-【数模应用】信用评分模型(附R语言和python代码实现)

信用评分模型是近年来兴起的一种为了保障银行和其他金融部门的金融安全而设立的一种关于人身金融权限的划定模型。该模型指根据客户的信用历史资料,利用一定的信用评分模型,得到不同等级的信用分数,根据客户的信用分数,来决定客户所可以持有的金额权限,从而保证还款等业务的安全性。而随着在现代社会和公司中,贷款,信用卡的作用日渐突出,信用评分模型的发展前景不可估量。信贷风险是指借款人因偿还贷款或履行合同承诺而破产而产生损失的可能性。传统上,它与贷款人无法偿还所欠利息和本金、影响现金流和增加装配成本所产生的风险有关。

qq_36130719的博客 364

会员管理小程序实战开发04-用户登录及注册

上一节我们介绍了用户信息数据源的创建及网格布局的使用,本节的话我们讲解用户的登录及注册功能任何开发。 在我们前述章节里介绍的,不论是管理员表还是用户表,都涉及到一个问题就是openid,那这个openid如何获取呢?如果我直接把代码贴给你,就缺失了一个思考的过程。既然这个是微信提出的概念,那么必然就会有官方文档作为对应。程序开发的基本功就是要会看官方文档,很多初学的开发同学可能会对官方文档颇有诟病,觉得不够基础。怎么说呢,当你进入到开发岗之后,自学能力是必要的,还是要试着可以看懂官方文档才好。 登录接口解读

低代码布道师的博客 1568

几年前写的博客都丢了,伤心!

好久没来优快云了。。。这里竟然空空如也! 还记得几年前,我也才曾在这里写过十几篇技术文章,可惜现在已经不知所踪。 自从两年前加入项目管理的大军,我的工作和生活已经发生了很多变化。如今回忆起来,确实有很多需要总结的地方。 然而,过去的毕竟已经过去,尚有未来可期。 为自己加油!!! ...

229

【AI智能体】Claude Code +Superpowers 项目实战操作详解

Claude Code +Superpowers 项目实战操作详解

congge 4049

年前跳槽还是年后跳槽

“2020年马上就要结束了,一年里无处安放的内心放的最多的是满满的求生欲!大家内心很是怀念当初没有新冠病毒的日子,因为每到周末大家放下手中的BUG尽情去干饭!NOW,最多的是手捧BUG干泡面!这一年你有没有抱怨?有没有迷茫?有没有实现不了的需求?有没有跳槽的冲动?” 01 — 年前 OR 年后 每到春节前两个月,都有一种“跳槽”的气息在蔓延,等老子(娘)拿完年终奖之后,就马上跳槽,不再看老板的这副鬼脸,要不是看在钱的面子上,才不会继续呆在这里呢。那么既然都有...

HANG.NIAN 1876

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

获取几年前的今天的日期 YY--MM--DD格式,获取某日期前后多少天

最近遇到了个问题,就是想要得到的今天的前几天,后几天,今天前几年,后几年。 既然不能确定想要得到今年之前之后的日期,又不能确定是几年,还是几天。那我们就做两个方法,一个方法为算出今年前后的某一年,另一个方法算出这年的前几天。下面简单介绍一下这两个方法 1.年 function getLastYearYestdy(num){ var date = new Date(); ...

lbchenxy的博客 817

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

装配件跑供应计划时,发现订单日期竟然是几年前

装配件跑供应计划时,发现订单日期竟然是几年前 最近在测试Demand Planning,给装配件生成Supply Plan的时候,发现Order Date竟然是几年前。差距有点太异常了。 刚开始以为是工艺路线上的run time设置问题,因为run time是按每单位来计算的。将工艺路线上的run time 设置为0后,Supply Plan并没有变化。实在不知道原因,就提了Case。 官方回复后...

NetSuite 张老师 673

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 获取前6个月_java 获取日期的几天前,几个月前和几年前的实例

实例如下:package bys.utils;import java.util.Date;/*** Created by toutou on 2015/3/23.*/public class DateHelper {public static final long ONE_MINUTE = 60000L;public static final long ONE_HOUR = 3600000L;pu...

weixin_42502811的博客 3583

关于几年前开设的课程的一些说明

最近看了下几年前开设的课程,现在看起来当时做的一些课程讲得的确不够深入,但是由于目前工作比较忙,暂时没有重录或者做深入视频的计划,当时是现学现讲先录制的,现在想起来当时还是比较幼稚的尝试。注:1、其中memcached的教程中读音应该是mem-cash-dee或者mem-cashed,我当时读的是memo-cashed,虽然在后面的memcached源码分析视频中纠正了读音,但由于该视频没有时间进...

每一天都有新的希望 1005

虚拟化数据恢复—虚拟机误还原几年前的快照怎么恢复数据?

虚拟化技术原理是将硬件虚拟化供不同的虚拟机使用,一台物理机上可以有多台虚拟机。人为误操作或者物理机故障会导致上层虚拟机不可用,甚至虚拟机里的重要数据丢失。下面给大家分享一个vmware虚拟化误操作还原快照的数据恢复案例。 虚拟化数据恢复环境: 一台由物理机迁移到EXSI上面的虚拟机,迁移完成后做了一个快照。该虚拟机上运行SQL Server数据库,记录了几年的数据。 EXSI虚拟化平台上一共有数十台虚拟机,EXSI连接了一台EVA存储,所有的虚拟机(包括故障虚拟机)都放在EVA存储上。

beiya123的博客 1242

经济类吴晓波的《大败局》,韩德强的《碰撞》。几年前看的了,现在还很有印象。...

经济类吴晓波的《大败局》,韩德强的《碰撞》。几年前看的了,现在还很有印象。

weixin_34124939的博客 193

让 AI 分析我 3 年前写的代码,全是漏洞!

对于个人开发者来说,这类工具可以帮你在提交代码前发现潜在问题,拿来检测一下自己之前的老项目代码也是不错的;对于团队来说,可以把 AI 接入到 CI/CD 流程中,自动化代码安全检查。

努力做最接地气的编程干货分享,感谢关注 1076

假如回到十年前,你想建一个什么样的网站?

少年不识老大愁,老大尤羡少时忧。 年幼的时候,总盼望着自己长大,因为长大就能独立,有自由,想做什么就做什么,可以不受父母的约束; 可是,长大后的自己,也有很多烦恼,要工作,要挣钱,要成家,要立业,要养娃,要养老..... 如果我们可以回到十年前,做回年少的自己,那时候我们会做些什么? 那么 对于我们各位畅游在互联网中的程序员小哥哥小姐姐来说 #如果可以回到十年前 你又想做(建)一...

黑马程序员广州中心的专栏 156

好久没写Blog了

好久没写Blog了,看了看几年前的足迹,当年的梦想很多没有实现,不过还有机会...

Merlin的专栏 492

别被吓退!关于AI写小说赚钱的真相,我亲测半年后想告诉你

AI辅助写小说:如何避免封号并实现稳定收益? 近期,关于“AI写小说是否会被封号”的讨论引发关注。实际上,主流平台如番茄小说、知乎盐选、晋江等并未禁止AI辅助创作,关键在于内容质量。若直接复制AI生成内容,缺乏原创性和“人味”,易被判定为低质或违规,导致限流或封号。 平台态度差异:番茄小说重内容质量,知乎盐选强调原创性和感染力,晋江允许AI辅助构思但正文需人工创作。建议流程:用AI(如笔灵、DeepSeek)生成大纲、设定,但正文需人工优化30%以上,注入细节与情感。投稿前需查重,控制AI痕迹低于15%。

huayishuo的博客 1万+

她现在能给你的,都是我十年前给过你的!

她现在能给你的,都是我十年前给过你的!想起在哪看到过一句这样的话,他出轨,仔细看这个小三都是自己以前的样子和影子!还硬要给对方贴上善良,纯净,容易满足的,容易让人放松….等等标签!   经过婚姻,经过磨合,面对困难,我们所有的平淡都是时间和困难磨砺后剩下的疮斑,她给的轻松和吸引,也只有在这种时候发挥作用吧!十年前,我也曾这样让你心猿意马。。。。   这样想,似乎不那么痛苦了。。。  

tatagg的专栏 787

雷军 26 年前写的代码,你见过吗?

点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!作者 | 程序师来源 |techug.com/post/code-wroten-by-leijun-22...

程序猿DD 992
上一篇: 网页设计中背景的创意风格与设计趋势!
下一篇: 【网站制作视频教程】-第06讲 html列表与图片应用!-传智播客
web886521
博客等级 码龄14年 12粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值