VCommon:基础程序集
作者:V君 发布于:2018-8-5 18:49 Sunday 分类:VCommon
此程序集作为通用应用程序基础类库(VCommon)的基础, 类库中其他程序集均引用本程序集.
提供了许多可用于偷懒的捷径扩展方法以及对.NET Framework做扩充, 不依赖第三方库.
源代码:SVNGit,
根命名空间 定义基础数据类型扩展方法和不便归类的实用类
BitAccessor 二进制位存取扩展方法
为有无符号 byte,short,int,long 分别提供一个名为Bit的扩展方法
使用起来和JQuery的手感相似
DateTimeExtensionMethod 日期时间扩展方法
GetBetweenMonths 收集两个DateTime值之间经过的月份
EnumExtensionMethod 枚举值扩展方法
GetFlags 分解一个组合Flag枚举值
StringExtensionMethod 字符串扩展方法,基本上就只是些捷径
JoinString 使js中数组的join能在C#中使用默认不设分隔符
IsNullOrEmpty / IsNullOrWhiteSpace 用来偷懒的扩展方法
TimeSpanFormatter 时间间隔字符串格式化扩展
ToReadableString TimeSpan扩展方法
传入一个组合Flag枚举值决定需要格式化输出的部分;
另外一bool参数决定是否显示值为0的部分,默认不显示.目前并没有实现多语言支持.
LazyHolder<T> 线程安全惰性初始化放置类
将实例创建提供者作为Func从构造传入,对外暴露Instance只读实例属性.
该属性首次被访问时调用实例提供者Func, 获取到实例之后放置到私有字段供后续使用.
VCommonException 类库异常基类
ParamsFunc 可变参数的Func, 与系统类库自带的Func不兼容.
命名空间 VCommon.Collections 自定义集合和为系统内置集合提供操作捷径扩展方法
ReadOnlyHashset<T> 只读哈希集
对现有系统HashSet进行封装, 为不可变类型提供基础.
实现了隐式转换, 可直接传入系统HashSet.
ShortcutExtensionMethod 捷径扩展方法
从SQL的In/Not In学来的姿势,为全部对象提供扩展方法,使代码更符合语义
具体实现调用Linq的Contains. 不要和查询表达式混淆!
CollectionExtensionMethod 集合扩展方法
IsNullOrEmpty 用来偷懒捷径,和字符串的类似,检查集合是否为空或者元素是否为0个.
EnumerableExtensionMethod IEnumerable扩展方法
WrapEnumerable 针对EF动态过滤,数组参数会导致非预期结果,需要对数组调用这个方法.
Stack / StackSequence 为连续序列的整理提供基础实现,如:过滤连续重复元素.
ToHashSet 用来偷懒的捷径,直接调用HashSet构造,传入被扩展的IEnumerable<T>对象
ToConcurrentDictionary 和上者差不多,参入一些逻辑来构建并发字典
命名空间 VCommon.DataModel 通用数据模型定义或辅助操作
TreeCopy 树状数据结构拷贝/变换操作基础实现
可以对相同或不同的树状数据结构进行拷贝, 按传入的结构变换回调执行递归.
命名空间 VCommon.Diagnostics 诊断相关辅助类
TimingMeasure 基于内置Stopwatch实现执行耗时测量基础实现
实现了IDispose接口,可以方便地写成using语句块
提供通过构造传入回调的实现,当执行离开using语句块时可以接收测量出来的时间
RetryPolicy 实现对action/func调用的异常处理重试策略
可分别指定重试次数和间隔时间,每次尝试的前,后,失败都可以通过回调感知.
失败的回调提供重试的次数以及发生的异常,返回bool决定是否继续尝试.
如果超过重试次数,抛出AggregateException带出所有发生的异常.
StackTraceExtensionMethod 为内置的StackTrace提供扩展方法
GetFormattedDetailStackTraceText
格式化每个堆栈帧带出程序集名称,可指定一个Type来截断内容.
用作记录打日志的位置十分合适.
命名空间 VCommon.IO 为内置IO功能做扩展
TempFile 实现了IDispose接口的临时文件封装,提供只读属性获取临时文件路径.
适用于不方便流式操作的场合.如调用外部命令行应用程序时.
封装了临时创建及删除的过程,可写成using语句块让代码更加结构化.
构造时调用Path.GetTempFileName获取临时文件,并在using语句块离开之后删除.
确保using语句块离开之前关闭文件.删不掉报错我不背锅!
PathExtensionMethod 路径操作扩展
CombinePath 字符串供扩展方法,用指定的分隔符连接字符串,达到路径连接的目的
可在第二个参数指定使用系统默认分隔符或正斜杠“/”
未做非法字符检查以及“..”简化
CombineWebPath 实为上个扩展方法的重载,将第二个参数固定为false
StreamExtensionMethod 流操作扩展
ReadFully 从流中读取全部内容并以字节数组返回 (by大神 Jon Skeet )
命名空间 VCommon.Linq.Expression.Predicate 查询表达式树构建
可以非常灵活的进行动态条件查询.
Internals/PredicateConcater 拼接表达式的具体实现,网上流传的PredicateBuilder
具体实现有点晦涩还和下面重名就藏到内部去了,封装成下面简单易用的写法.
PredicateWrap 实现了逻辑操作符重载支持的查询表达式封装类
提供查询表达式隐式转换和 &、| 操作符重载.
具体实现使用上者进行表达式拼接, 兼容null传参, 表示啥也不做(不参与过滤).
PredicateBuilder 提供了常用查询条件操作符表达式生成
可以轻松生成上者的实例, 兼容null传参.
目前提供了多种常用操作符,例如like、between、in、=、<、>等.
本类被定义成泛型单例,目的是为了方便实现扩展方法,用在应用程序框架十分方便.
命名空间 VCommon.Logging 定义日志类接口以及具体实现实例放置
Logger 打日志的入口
内部Hold住一个ILogger实例,通过Init方法传递进去.
定义为静态类,静态方法调用Hold住的ILogger,可以在任意位置调用.
ILogger 日志记录器接口定义,提供了6个级别
DefaultLogger 对ILogger的伪实现,内部调用Logger的静态方法
针对不方便调用静态方法的情形(目前似乎没有)
会导致无限递归因此不能用作Logger.Init参数,已做传参校验.
MultiLogger 多目标Tee实现,实现ILogger接口,例如输出到控制台的同时也写入到文件
通过构造把多个ILogger实例传入到内部Hold住,在每个ILogger实现方法里循环调用.
NullLogger 什么都不做的空实现,如果连控制台都不想输出,就用这货的实例来初始化吧!
作为构造参数传入MultiLogger会被忽略
TextLogPool 文本日志池,零散多文件线程安全写入,实现IDispose接口
适用于为多个数据来源分别写入文件的情形,做了线程安全控制,异步并发调用也支持.
内部自主维护多个FileStream实例,在超过指定闲置时间并没有操作会自动将其关闭.
使用者只需要调用 AppendText(string path,string content):bool
具体实现会先去检查路径对应实例是否已创建,若已创建则拿出来用,否则创建一个.
不会抛异常.返回值告诉你有没有写入成功,若不成功会把错误详情和内容一起写到警告日志.
命名空间 VCommon.Reflection 定义反射、特性辅助类和扩展方法
AttributeExtensionMethod 为确认及寻找特性提供扩展方法
针对.NET里面的特性反射不包括接口,就扩展了一下.
并不是给特性加扩展,而是给需要找特性的类,命名有点反过来
DynamicMemberAccess 顾名思义就是动态成员访问
通过泛型参数给定要访问的类以及返回值类型,以及构造参数传入成员名
就可以读取静态或实例成员(属性或字段)的值, 具体实现使用了表达式编译.
EnumBind/EnumBindAttribute 提供枚举值与类型定义的绑定特性
提供枚举值和类定义双向查找.
可用在基类定义枚举字段,按值区分子类的情形,如json类型自动绑定到子类
EnumMeta/EnumMetaAttribute 上者类似的实现,和Description用法类似
可用于控制枚举提供给界面显示的内容.
TypeExtensionMethod 为Type提供一些扩展方法
GetPublicInstanceProperties/GetPublicInstanceFields/GetPublicInstanceMethods
这三者从名称就能看出来是干啥用的. ((′?((☆ミつ
FilterInterfaces 这要重点讲一讲
首先获取被扩展Type对象的全部接口, 然后按照传参进来的接口定义逐个进行匹配,
若接口是泛型则取其泛型定义来匹配,否则直接匹配.
将匹配结果以字典的方式返回,另外用out吐出未匹配的接口
在按接口自动注入容器时很好用
TypeFinder 从ABP仿来的实现
初始化时从当前应用程序域中检索全部程序集,并逐个检索全部类定义并装入集合.
在需要遍历查找时就不用再爬一边全部程序集了.
命名空间 VCommon.Security 定义安全相关辅助类
RandomStringGenerator 随机字符串生成器
GuidBasedRandomHexString64 基于GUID夹杂密码学随机数生成器凑出64位十六进制字符串
用作身份验证Token
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)
发表评论: