# 扩展方法集合 **Repository Path**: zijian666/any-extensions ## Basic Information - **Project Name**: 扩展方法集合 - **Description**: 万物皆可扩展 - **Primary Language**: C# - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2022-11-04 - **Last Updated**: 2025-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # any-extensions 万物皆可扩展 [zijian666.AnyExtensions 更新说明](src/zijian666.AnyExtensions/UPLOGS.md) [zijian666.AnyExtensions.ComponentModel 更新说明](src/zijian666.AnyExtensions.ComponentModel/UPLOGS.md) # NuGet [zijian666.AnyExtensions](https://www.nuget.org/packages/zijian666.AnyExtensions/) [zijian666.AnyExtensions.ComponentModel](https://www.nuget.org/packages/zijian666.AnyExtensions.ComponentModel/) # 扩展方法 ## 布尔型扩展 > [BooleanExtensions](src/zijian666.AnyExtensions/BooleanExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | [Not](src/zijian666.AnyExtensions/BooleanExtensions.cs#L11) | 取反 | 1.0.0 | | 2 | [IsNullOrTrue](src/zijian666.AnyExtensions/BooleanExtensions.cs#L15) | 值为 `null` 或 true | 1.0.0 | | 3 | [IsNullOrFalse](src/zijian666.AnyExtensions/BooleanExtensions.cs#L19) | 值为 `null` 或 false | 1.0.0 | | 4 | [IsTrue](src/zijian666.AnyExtensions/BooleanExtensions.cs#L23) | 有值 且为 true | 1.0.0 | | 5 | [IsFalse](src/zijian666.AnyExtensions/BooleanExtensions.cs#L27) | 有值 且为 false | 1.0.0 | ## 集合扩展 > [CollectionExtensions](src/zijian666.AnyExtensions/CollectionExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | [DistinctWithoutNull](src/zijian666.AnyExtensions/CollectionExtensions.cs#L18) | 返回排除空对象(`null`)后的去重集合 | 1.0.0 | | 2 | [GetValueOrDefault](src/zijian666.AnyExtensions/CollectionExtensions.cs#L65) | 获取字典中的值如果key不存在则返回默认值 | 1.0.0 | | 3 | [GetValues](src/zijian666.AnyExtensions/CollectionExtensions.cs#L81) | 从字典中批量获取对象 | 1.0.0 | | 4 | [IsSame](src/zijian666.AnyExtensions/CollectionExtensions.cs#L130) | 比较2个数组是否一致 | 1.0.0 | | 5 | [IsNullOrEmpty](src/zijian666.AnyExtensions/CollectionExtensions.cs#L169) | 判断一个集合是否为空 | 1.0.0 | | 6 | [Join](src/zijian666.AnyExtensions/CollectionExtensions.cs#L214) | 调用 `string.Join` 生成新的字符串 | 1.0.0 | | 7 | [ToHashSet](src/zijian666.AnyExtensions/CollectionExtensions.cs#L228) | 创建 `HashSet` | 1.0.0 | | 8 | [WithoutNull](src/zijian666.AnyExtensions/CollectionExtensions.cs#L283) | 排除集合中的空对象(`null`) | 1.0.0 | | 9 | [WithoutWhiteSpace](src/zijian666.AnyExtensions/CollectionExtensions.cs#L309) | 排除集合中的空白字符串 | 1.0.0 | | 10 | [WithoutDefaultValue](src/zijian666.AnyExtensions/CollectionExtensions.cs#L318) | 排除集合中的默认值 | 1.0.0 | | 11 | [AsReadOnly](src/zijian666.AnyExtensions/CollectionExtensions.cs#L335) | 转为只读集合 | 1.0.0 | | 12 | [Each](src/zijian666.AnyExtensions/CollectionExtensions.cs#L359) | 循环集合 | 1.0.0 | | 13 | [FindByIn](src/zijian666.AnyExtensions/CollectionExtensions.cs#L393) | 筛选集合中某个属性值包含在另一集合中的数据 | 1.0.0 | | 14 | [FindByNotIn](src/zijian666.AnyExtensions/CollectionExtensions.cs#L431) | 筛选集合中某个属性值不包含在另一集合中的数据 | 1.0.6 | | 15 | [WhereIf](src/zijian666.AnyExtensions/CollectionExtensions.cs#L469) | 判断后调用筛选函数 | 1.0.2 | | 16 | [If](src/zijian666.AnyExtensions/CollectionExtensions.cs#L493) | 判断后执行其他操作 | 1.0.12 | | 17 | [AsHashSet](src/zijian666.AnyExtensions/CollectionExtensions.cs#L228) | 转为 `HashSet`,如果本身就是`HashSet`则直接返回 | 1.0.15 | ## 区域信息扩展 > [CultureInfoExtensions](src/zijian666.AnyExtensions/CultureInfoExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | [GetStringComparer](src/zijian666.AnyExtensions/CultureInfoExtensions.cs#L18) | 使用`CompareOptions`获取字符串比较器 | 1.0.13 | | 2 | [CreateDictionary](src/zijian666.AnyExtensions/CultureInfoExtensions.cs#L35) | 使用`CompareOptions`创建字典 | 1.0.13 | | 3 | [CreateHashSet](src/zijian666.AnyExtensions/CultureInfoExtensions.cs#L44) | 使用`CompareOptions`创建哈希集合 | 1.0.13 | ## 时间扩展 > [DateTimeExtensions](src/zijian666.AnyExtensions/DateTimeExtensions.cs) *也适用于DateTimeOffset* | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | ToDateTimeString | 将时间类型转为日期时间字符串 `yyyy-MM-dd HH:mm:ss` | 1.0.0 | | 2 | ToDateString | 将时间类型转为日期字符串 `yyyy-MM-dd` | 1.0.0 | | 3 | ToTimeString | 将时间类型转为时间字符串 `HH:mm:ss` | 1.0.0 | | 4 | LastSecondsOfDay | 获取此实例时间所在的那一天的最后一秒 | 1.0.0 | | 5 | FirstDayOfMonth | 获取此实例时间所在的那个月的第一天 | 1.0.0 | | 6 | LastDayOfMonth | 获取此实例时间所在的那个月的最后一天 | 1.0.0 | | 7 | FirstDayOfYear | 获取此实例时间所在的那一年的第一天 | 1.0.0 | | 8 | LastDayOfYear | 获取此实例时间所在的那一年的最后一天 | 1.0.0 | | 9 | SundayOfWeek | 获取此实例时间所在的那一周的星期日 | 1.0.0 | | 9 | MondayOfWeek | 获取此实例时间所在的那一周的星期一 | 1.0.0 | | 9 | TuesdayOfWeek | 获取此实例时间所在的那一周的星期二 | 1.0.0 | | 9 | WednesdayOfWeek | 获取此实例时间所在的那一周的星期三 | 1.0.0 | | 9 | ThursdayOfWeek | 获取此实例时间所在的那一周的星期四 | 1.0.0 | | 9 | FridayOfWeek | 获取此实例时间所在的那一周的星期五 | 1.0.0 | | 9 | SaturdayOfWeek | 获取此实例时间所在的那一周的星期六 | 1.0.0 | ## 枚举扩展 > [EnumExtensions](src/zijian666.AnyExtensions/EnumExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | GetDescription | 获取枚举值的描述 | 1.0.0 | | 2 | FlagsSplit | 拆分 `FlagsAttribute` 标记的枚举 | 1.0.0 | | 3 | FlagsCombine | 合并枚举 | 1.0.0 | | 4 | GetFieldInfo | 获取枚举对应的字段`FieldInfo` | 1.0.0 | ## 异常操作扩展 > [ExceptionExtensions](src/zijian666.AnyExtensions/ExceptionExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Check | 开启参数校验 | 1.0.0 | | 2 | ThrowIfNull | 判断参数是否为null | 1.0.0 | | 3 | ThrowIfDefault | 判断参数是否为默认值 | 1.0.0 | | 4 | ThrowIfEmpty | 判断参数(集合或字符串)是否为空 | 1.0.0 | | 5 | GetAllExceptions | 循环当前异常的所有内部异常 | 1.0.0 | | 6 | ThrowFirstError | 抛出第一个异常,如果没有则不执行任何操作 | 1.0.0 | | 7 | ThrowAllError | 如果存在一个以上的异常,则尝试聚合异常后抛出; 如果只有一个异常直接抛出 | 1.0.0 | | 8 | Throw | 如果异常不为空,则抛出异常 | 1.0.0 | | 9 | Aggregate | 如果有必要,聚合异常,默认最大聚合异常10个,超过则丢弃 | 1.0.0 | ## Linq表达式编译程序 > [ExpressionExtensions](src/zijian666.AnyExtensions/ExpressionExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Property | 访问属性,支持子属性,例如(propertyName = "Child.Name") | 1.0.0 | | 2 | BodyProxy | 使用新的参数代理表达树中的方法体 | 1.0.0 | | 3 | Proxy | 使用新的参数构建表达式 | 1.0.0 | | 4 | FindParameter | 尝试查找表达式中所使用的参数 | 1.0.0 | | 5 | Type | 尝试获取表达式在操作中的类型 | 1.0.0 | | 6 | Call | 构建调用静态方法的表达式 | 1.0.0 | | 7 | Lambda | 构建泛型委托表达式 | 1.0.0 | | 8 | GreaterThan | 构建比较表达式 | 1.0.0 | | 9 | GreaterThanOrEqual | 构建比较表达式 | 1.0.0 | | 10 | LessThanOrEqual | 构建比较表达式 | 1.0.0 | | 11 | Between | 构建比较表达式 | 1.0.0 | | 12 | NotBetween | 构建比较表达式 | 1.0.0 | | 13 | Equal | 构建比较表达式 | 1.0.0 | | 14 | StringOperation | 构建字符串操作的比较表达式 | 1.0.0 | | 15 | Like | 构建字符串模糊匹配操作表达式 | 1.0.0 | | 16 | NotLike | 构建字符串模糊匹配操作表达式 | 1.0.0 | | 17 | StartsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 18 | NotStartsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 19 | EndsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 20 | NotEndsWith | 构建字符串操作的比较表达式 | 1.0.0 | ## 比较操作扩展 > [IComparableExtensions](src/zijian666.AnyExtensions/IComparableExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | ~~1~~ | ~~MinOf~~ | ~~返回不大于指定值的值~~ | 已废弃 | | ~~2~~ | ~~MaxOf~~ | ~~返回不小于指定值的值~~ | 已废弃 | | 3 | BetweenOf | 返回位于最大值和最小值之间的值 | 1.0.5 | | 4 | GreaterThan | 返回不大于指定值的值 | 1.0.14 | | 5 | LessThan | 返回不小于指定值的值 | 1.0.14 | ## 数字扩展 > [NumberExtensions](src/zijian666.AnyExtensions/NumberExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Round | 将小数值舍入到指定精度,默认四舍五入 | 1.0.0 | | 2 | Ceiling | 返回大于或等于指定小数位的数 | 1.0.0 | | 3 | Floor | 返回小于或等于指定小数位的数 | 1.0.0 | | 4 | Scale | 按指定模式和位数对数字进行处理 | 1.0.0 | | 5 | ToDecimal | 将double或float转为Decimal类型,15位有效数字内不会丢失精度 | 1.0.0 | ## Object扩展 > [ObjectExtensions](src/zijian666.AnyExtensions/ObjectExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | If | 判断条件后确定是否执行操作 | 1.0.14 | | 2 | TryDispose | 如果对象实现了 IDisposable 接口则尝试释放对象, 且忽略异常 | 1.0.17 | | 3 | TryDisposeAsync | 异步 TryDispose | 1.0.17 | | 4 | ThrowIfDisposed | 如果条件满足则抛出异常 |1.0.17 | ## CancellationToken扩展 > [CancellationTokenExtensions](src/zijian666.AnyExtensions/CancellationTokenExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | RegisterDispose | 注册一个对象的释放操作到 CancellationTokenSource 的取消令牌中。 | 1.0.17 | | 2 | GetToken | 获取 CancellationTokenSource 的取消令牌,即使对象被释放也不会报错。 | 1.0.17 | | 3 | 如果 CancellationTokenSource 已请求取消,则抛出异常。 | 如果条件满足则抛出异常 |1.0.17 | ## 分页相关扩展方法 > [PagingExtensions](src/zijian666.AnyExtensions/PagingExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Paging | Linq分页 | 1.0.0 | | 2 | Select | 将Linq分页列表内的元素转换为另一种类型 | 1.0.7 | | 3 | ToPagedList | 将一个 IEnumerable<T> 转换为Linq分页返回值 | 1.0.15 | ## 数据聚合构建处理扩展方法 > [DataAggregateBuilderExtensions](src/zijian666.AnyExtensions/DataAggregateBuilderExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Aggregate | 聚合数据 | 1.0.18 | | 2 | AggregateMany | 聚合数据到多个值 | 1.0.18 | | 3 | Filter | 过滤数据 | 1.0.18 | | 4 | Notnull | 过滤null数据 | 1.0.18 | | 5 | Build | 使用聚合值构建新数据 | 1.0.18 | | 6 | Action | 执行操作 | 1.0.18 | | 7 | ToList | 返回新列表 | 1.0.18 | ## 待查询对象扩展 > [QueryableExtensions](src/zijian666.AnyExtensions/QueryableExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | LinqBuidler | 创建表达式树构建程序 | 1.0.0 | | 2 | IsNullOrEmpty | 确定序列中没有任何元素满足条件。参考集合扩展 | 1.0.0 | | 3 | ToHashSet | 创建 `HashSet`。参考集合扩展 | 1.0.0 | | 3 | FindByIn | 构建 `where {columnName} in ( {values} )` 语句查询数据库 | 1.0.0 | | 4 | FindByNotIn | 构建 `where {columnName} not in ( {values} )` 语句查询数据库 | 1.0.6 | | 5 | FindByIds | 构建 `where Id in ( {values} )` 语句查询数据库 | 1.0.0 | | 6 | WithoutDeleted | 排除已删除的数据,构建 `where {IsDelete} != 1` 语句查询数据库 | 1.0.0 | | 7 | Between | 构建 `where {columnName} >= {begin} and {columnName} <= {end}` 语句查询数据库 | 1.0.0 | | 8 | OrderBy | 使用字符串方式操作集合排序 | 1.0.0 | | 9 | ThenBy | 使用字符串方式操作集合排序 | 1.0.0 | | 10| WhereIf | 判断后调用Where | 1.0.0 | | 11| If | 判断后执行其他操作 | 1.0.12 | ## 字符串扩展 > [StringExtensions](src/zijian666.AnyExtensions/StringExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | IsNullOrEmpty | 指示字符串是 null 还是空字符串 ("")。 | 1.0.0 | | 2 | IsNullOrWhiteSpace | 指示字符串是 null、空还是仅由空白字符组成。 | 1.0.0 | | 3 | EmptyOrDefault | 如果字符串是 null 或空字符串 (""),则返回 `defaultValue` | 1.0.0 | | 4 | WhiteSpaceOrDefault | 如果字符串是null、空或是仅由空白字符组成,则返回 `defaultValue` | 1.0.0 | | 5 | Split | 按照指定符号切分字符串,并转为指定格式,如果不传默认分割为 `',', ' ', ';', '\n', '\r', '\t'` | 1.0.0 | | 6 | EncodeSqlLike | 编码为 like 查询时可用的字符串 | 1.0.0 | | 7 | EncodeFileName | 编码为 文件名可用的字符串(主要是将半角改为全角) | 1.0.0 | | 8 | Slice | 截断字符串(支持负索引,为从右往左的位置) | 1.0.12 | | 9 | Masking | 字符串脱敏 | 1.0.12 | | 10 | EqualsIgnoreCase | 字符串比较忽略大小写 | 1.0.13 | | 11 | EqualsSqlServerString | 字符串比较忽略大小写和全半角 | 1.0.13 | | 12 | Parse/TryParse | 将字符串转换为它的等效指定类型 | 1.0.15 | ## 结构体扩展 > [StructExtensions](src/zijian666.AnyExtensions/StructExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | IsNullOrDefault | 判断值为空或默认值 | 1.0.0 | | 2 | NotNullOrDefault | 判断值不是空或默认值 | 1.0.0 | ## Task 扩展 > [TaskExtensions](src/zijian666.AnyExtensions/TaskExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Then | task 执行成功后执行下一个操作 | 1.0.15 | | 2 | Catch | task 执行异常时执行回调 | 1.0.15 | | 3 | Finally | task 执行完成后,无论是否异常,都执行回调 | 1.0.15 | ## System.ComponentModel 扩展包 > [ValidationExceptionExtensions](src/zijian666.AnyExtensions.ComponentModel/ValidationExceptionExtensions.cs) | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | ValidatEntity | 实体类校验 | 1.0.0 | | 序号 | 验证特性 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | ValidateAttribute | 属性需要递归验证 | 1.0.6 | | 2 | NotAttribute | 不允许指定的值 | 1.0.6 | | 3 | NotDefaultAttribute | 不允许默认值 | 1.0.6 | | 4 | AllowAttribute | 仅允许指定的值 | 1.0.7 | | 5 | EnumAttribute | 取值范围必须是枚举已定义的值 | 1.0.7 | | 6 | NoScriptAttribute | 字符串不能包含脚本 | 1.0.7 | ## 用于动态构建单一参数的表达式树 > [LinqExpressionBuilder](src/zijian666.AnyExtensions/LinqExpressionBuilder.cs) 基于`ExpressionExtensions`实现 | 序号 | 扩展方法 | 说明 | 版本 | | --- | -------- | -------- | --- | | 1 | Equal | 构建比较表达式 | 1.0.0 | | 2 | GreaterThan | 构建比较表达式 | 1.0.0 | | 3 | GreaterThanOrEqual | 构建比较表达式 | 1.0.0 | | 3 | LessThanOrEqual | 构建比较表达式 | 1.0.0 | | 4 | Between | 构建比较表达式 | 1.0.0 | | 5 | NotBetween | 构建比较表达式 | 1.0.0 | | 6 | StringOperation | 构建字符串操作的比较表达式 | 1.0.0 | | 7 | Like | 构建字符串模糊匹配操作表达式 | 1.0.0 | | 9 | NotLike | 构建字符串模糊匹配操作表达式 | 1.0.0 | | 10 | StartsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 11 | NotStartsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 12 | EndsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 13 | NotEndsWith | 构建字符串操作的比较表达式 | 1.0.0 | | 13 | And | 使用And方式组合2个表达式 | 1.0.0 | | 14 | Or | 使用Or方式组合2个表达式 | 1.0.0 | | 15 | Not | 反转表达式的结果 | 1.0.0 | | 16 | Property | 构建获取实体属性的表达式 | 1.0.0 |
示例代码,点击展开 ### 例1: ```C# var query = db.AsQueryable(); var builder = query.LinqBuidler(); // 构建 list.Where(x => x.Number == number)ToList(); _ = query.Where(builder.Equal("Number", number)).ToList(); // 构建 list.Where(x => new []{1,2,3,4}.Contains(x.Number) )ToList(); _ = query.Where(builder.Equal("Number", new []{1,2,3,4})).ToList(); ``` ### 例2: ```C# var where = builder.NotEqual("IsDelete", true); // 类型会做一些简单规则的转换,比如数据库是int 比较的值是bool if ( ... ) { where = builder.And(where, builder.StartsWith("Code", "ORDER_0001")); } if ( ... ) { var begin = DateTime.Today; var end = DateTime.Today.LastSecondsOfDay(); // Between 会正确处理 begin = null 或 end = null的情况, 但2个同时为null 会返回 x => false where = builder.And(where, builder.Between("CreateTime", begin, end)); } if ( ... ) { where = builder.Not(where); } _ = query.Where(where).ToList(); ```