# XiaoFeng.Core
**Repository Path**: fasterfish/XiaoFeng.Core
## Basic Information
- **Project Name**: XiaoFeng.Core
- **Description**: C#公用类库,网络库,包含了Json,Xml,ADO.NET数据库操作兼容以下数据库,正则表达式,QueryableX(ORM)和EF无缝对接,网络日志,调度,IO操作,加密算法,应用池,类型转换等功能。
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 5
- **Created**: 2023-10-29
- **Last Updated**: 2023-10-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# XiaoFeng.Core






Nuget:XiaoFeng.Core
| QQ群号 | QQ群 | 公众号 |
| :----:| :----: | :----: |
| 748408911 |  |  |
源码: https://github.com/zhuovi/xiaofeng.core
教程: https://www.eelf.cn
C#公用核心基础库,包含了Json,Xml,ADO.NET数据库操作兼容以下数据库(SQLSERVER,MYSQL,ORACLE,达梦,SQLITE,ACCESS,OLEDB,ODBC等数十种数据库),正则表达式,QueryableX(ORM)和EF无缝对接,网络日志,调度,IO操作,加密算法(AES,DES,DES3,MD5,RSA,RC4,SHA等常用加密算法),超级好用的配置管理器,应用池,类型转换等功能。
## XiaoFeng.Core
XiaoFeng.Core generator with [XiaoFeng.Core](https://github.com/zhuovi/XiaoFeng.Core).
## Install
.NET CLI
```
$ dotnet add package XiaoFeng.Core --version 2.3.5
```
Package Manager
```
PM> Install-Package XiaoFeng.Core --Version 2.3.5
```
PackageReference
```
```
Paket CLI
```
> paket add XiaoFeng.Core --version 2.3.5
```
Script & Interactive
```
> #r "nuget: XiaoFeng.Core, 2.3.5"
```
Cake
```
// Install XiaoFeng.Core as a Cake Addin
#addin nuget:?package=XiaoFeng.Core&version=2.3.5
// Install XiaoFeng.Core as a Cake Tool
#tool nuget:?package=XiaoFeng.Core&version=2.3.5
```
# 更新日志
## v 2.3.5
### Job 作业
1.增加作业Job设置取消指令方法,启动设置取消指令方法;
2.优化IJob事件;
### XiaoFeng.ParameterCollection 参数集
1.ParameterCollection中增加ToJson方法;
### XiaoFeng.Http 网络库
1.增加HttpHelper中HttpRequest类中直接可以调用DownFileAsync;
### XiaoFeng.PrototypeHelper 扩展方法
1.优化For扩展方法;
2.增加扩展方法Object.ToStringX();
3.优化扩展方法GetValue中字符串转换对象的匹配;
### 正则表达式
1.优化正则表达式网址,Ftp正则增加汉字识别;
### XiaoFeng.Json
1.优化Json可以把对象转成字符串的属性StringObjectConverter;
### XiaoFeng.Threading
1.Setting设置Job消息日志最大条数;
2.优化作业调度,把一次性作业,间隔作业独立处理,提高定时调度性能,优化作业记录日志最大记录减少内存开支;
3.任务队列升级到可多线程消费任务;优化调度作业取消事件;
### XiaoFeng.Log
1.升级日志,增加高并发下日志写的没有输入多时导致内存一直上涨的问题,队列数据超过65535就清空一次队列;
## 2023-08-29 v 2.3.4
1.优化Redis有时为无限等待bug;
2.优化Redis连接;
3.优化ParameterCollection
## 2023-08-22 v 2.3.3
1.HttpHelper中HttpSocket获取Https优化;
2.XiaoFeng设置中增加调度日志输出等级设置,默认是Warn;
3.增加ParameterCollection类专一来处理参数排序拼接;
4.修改JobScheduler输出日志等级;
5.增加将枚举转换换成字符串大小写表示形式;
6.ParameterCollection类增加GetBytes方法,增加多种构造器可以设置是否URL编码及字符串编码;
7.增加扩展RSAEncryption算法SignHash,VerifyHash;
8.修复Json,Xml中类型为可空枚举时,应该序列化成key则序列化成value的bug;
9.优化Redis关闭;
## 2023-08-03 v 2.3.0
1.删除过渡命名空间XiaoFeng.Model.Core;
2.优化通过模型生成数据表;
3.新增索引属性TableIndexAttribute;
4.新增模型索引属性;新增获取模型索引属性;
5.新增查找数据库表是否存在;
6.修复获取枚举GetDescription时无当前枚举时报错;
7.增加调度作业Ijob中参数可通过方法分步设置;
8.设置作业任务接口IJobWorker;
9.增加FayFile的GetBytes,GetText()方法;
10.ConfigSet增加泛路径设置,一个配置模型匹配多个配置文件;
11.更新线程池清除过期时间长度为10分钟;
12.修复在NETSTANDARD 2.0下没有Split(char )方法;
13.修复mysql中date_format格式;
14.修复HttpRequest中ClentCertificates改为ClientCertificates;
## 2023-05-16 v 2.2.2
1.优化DataHelperX;
2.优化ToCast Byte转SByte;
3.优化ResponseMessage为空的字段不显示;
4.修复判断身份证号正则,JSON正则bug;
5.增加ToJson是否忽略定义节点;
6.增加ToJson长整型大于9007199254740992时是否序列化成字符串节点;
7.修复JSON序列化长整型大于9007199254740992时前端显示0的问题;
---
# XiaoFeng 类库包含库
| 命名空间 | 所属类库 | 开源状态 | 说明 | 包含功能 |
| :----| :---- | :---- | :----: | :---- |
| XiaoFeng.Prototype | XiaoFeng.Core | :white_check_mark: | 扩展库 | ToCase 类型转换
ToTimestamp,ToTimestamps 时间转时间戳
GetBasePath 获取文件绝对路径,支持Linux,Windows
GetFileName 获取文件名称
GetMatch,GetMatches,GetMatchs,IsMatch,ReplacePatten,RemovePattern 正则表达式操作
|
| XiaoFeng.Net | XiaoFeng.Net | :white_check_mark: | 网络库 | XiaoFeng网络库,封装了Socket客户端,服务端(Socket,WebSocket),根据当前库可轻松实现订阅,发布等功能。|
| XiaoFeng.Http | XiaoFeng.Core | :white_check_mark: | 模拟请求库 | 模拟网络请求 |
| XiaoFeng.Data | XiaoFeng.Core | :white_check_mark: | 数据库操作库 | 支持SQLSERVER,MYSQL,ORACLE,达梦,SQLITE,ACCESS,OLEDB,ODBC等数十种数据库 |
| XiaoFeng.Cache | XiaoFeng.Core | :white_check_mark: | 缓存库 | 内存缓存,Redis,MemcachedCache,MemoryCache,FileCache缓存 |
| XiaoFeng.Config | XiaoFeng.Core | :white_check_mark: | 配置文件库 | 通过创建模型自动生成配置文件,可为xml,json,ini文件格式 |
| XiaoFeng.Cryptography | XiaoFeng.Core | :white_check_mark: | 加密算法库 | AES,DES,RSA,MD5,DES3,SHA,HMAC,RC4加密算法 |
| XiaoFeng.Excel | XiaoFeng.Excel | :white_check_mark: | Excel操作库 | Excel操作,创建excel,编辑excel,读取excel内容,边框,字体,样式等功能 |
| XiaoFeng.Ftp | XiaoFeng.Ftp | :white_check_mark: | FTP请求库 | FTP客户端 |
| XiaoFeng.IO | XiaoFeng.Core | :white_check_mark: | 文件操作库 | 文件读写操作 |
| XiaoFeng.Json | XiaoFeng.Core | :white_check_mark: | Json序列化,反序列化库 | Json序列化,反序列化库 |
| XiaoFeng.Xml | XiaoFeng.Core | :white_check_mark: | Xml序列化,反序列化库 | Xml序列化,反序列化库 |
| XiaoFeng.Log | XiaoFeng.Core | :white_check_mark: | 日志库 | 写日志文件,数据库 |
| XiaoFeng.Memcached | XiaoFeng.Memcached | :white_check_mark: | Memcached缓存库 | Memcached中间件,支持.NET框架、.NET内核和.NET标准库,一种非常方便操作的客户端工具。实现了Set,Add,Replace,PrePend,Append,Cas,Get,Gets,Gat,Gats,Delete,Touch,Stats,Stats Items,Stats Slabs,Stats Sizes,Flush_All,Increment,Decrement,线程池功能。|
| XiaoFeng.Redis | XiaoFeng.Redis | :white_check_mark: | Redis缓存库 | Redis中间件,支持.NET框架、.NET内核和.NET标准库,一种非常方便操作的客户端工具。实现了Hash,Key,String,ZSet,Stream,Log,List,订阅发布,线程池功能; |
| XiaoFeng.Threading | XiaoFeng.Core | :white_check_mark: | 线程库 | 线程任务,线程队列 |
| XiaoFeng.Mvc | XiaoFeng.Mvc | :x: | 低代码WEB开发框架 | .net core 基础类,快速开发CMS框架,真正的低代码平台,自带角色权限,WebAPI平台,后台管理,可托管到服务运行命令为:应用.exe install 服务名 服务说明,命令还有 delete 删除 start 启动 stop 停止。 |
| XiaoFeng.Proxy | XiaoFeng.Proxy | :white_check_mark: | 代理库 | 开发中 |
| XiaoFeng.TDengine | XiaoFeng.TDengine | :white_check_mark: | TDengine 客户端 | 开发中 |
| XiaoFeng.GB28181 | XiaoFeng.GB28181 | :white_check_mark: | 视频监控库,SIP类库,GB28181协议 | 开发中 |
| XiaoFeng.Onvif | XiaoFeng.Onvif | :white_check_mark: | 视频监控库Onvif协议 | XiaoFeng.Onvif 基于.NET平台使用C#封装Onvif常用接口、设备、媒体、云台等功能, 拒绝WCF服务引用动态代理生成wsdl类文件 , 使用原生XML扩展标记语言封装参数,所有的数据流向都可控。 |
| FayElf.Plugins.WeChat | FayElf.Plugins.WeChat | :white_check_mark: | 微信公众号,小程序类库 | 微信公众号,小程序类库。 |
# XiaoFeng 扩展方法
## 万能的类型转换扩展方法 ToCast()
当前方法可转换任何值类型包括 对象类型,数组类型.
在转换方法前,首选会验证当前值,类型和要转换的类型是否相同,接着就是验证,它是否符合目标类型的格式,如果不符合会转换成目标类型的默认值,也可以设置默认值。
数据类型相互转换如:
字符串转整型,字符串转日期,字符串转UUID
### 用法示例:
```csharp
using XiaoFeng;
int a = "10".ToCast();
Int64 b = "10".ToCast();
double c = "10".ToCast();
DateTime d = "2022-01-19".ToCast();
float e = "".ToCast(1.0);
int f = (int)"".GetValue(typeof(int));
Guid g = "58AFBEB5791311ECBF49FA163E542B11".ToCast();
Guid h = "58AFBEB5-7913-11EC-BF49-FA163E542B11".ToCast();
```
还有一系列专一处理字符串转相关类型的方法,如:
```csharp
Int16 a = "1".ToInt16();
int b = "2".ToInt32();
Int64 c = "3".ToInt64();
UInt16 d = "4".ToUInt16();
UInt32 e = "5".ToUInt32();
UInt64 f ="6".ToUInt64();
float e = "7.2".ToFloat();
DateTime g = "2022-01-19 12:32".ToDateTime();
double h = "6.3".ToDouble();
byte i = "2".ToByte();
Boolean j = "1".ToBoolean();
Boolean k = "true".ToBoolean();
Boolean l = "False".ToBoolean();
Decimal m = "3.658".ToDecimal();
long n = "2584512".ToLong();
Guid o = "58AFBEB5791311ECBF49FA163E542B11".ToGuid();
Guid p = "58AFBEB5-7913-11EC-BF49-FA163E542B11".ToGuid();
```
## 获取对象基础类型 GetValueType
### 用法实例
```csharp
var a = "a".GetValueType();
var b = 10.GetValueType();
var c = new{a="a",b="b"}.GetValueType();
var d = new Dictionary().GetValueType();
```
返回的是一个枚举类型 ValueTypes
```csharp
///
/// 值类型枚举
///
public enum ValueTypes
{
///
/// 空
///
[Description("空")]
Null = 0,
///
/// 值
///
[Description("值")]
Value = 1,
///
/// 类
///
[Description("类")]
Class = 2,
///
/// 结构体
///
[Description("结构体")]
Struct = 3,
///
/// 枚举
///
[Description("枚举")]
Enum = 4,
///
/// 字符串
///
[Description("字符串")]
String = 5,
///
/// 数组
///
[Description("数组")]
Array = 6,
///
/// List
///
[Description("List")]
List = 7,
///
/// 字典
///
[Description("字典")]
Dictionary = 8,
///
/// ArrayList
///
[Description("ArrayList")]
ArrayList = 9,
///
/// 是否是集合类型
///
[Description("是否是集合类型")]
IEnumerable = 10,
///
/// 字典类型
///
[Description("字典类型")]
IDictionary = 11,
///
/// 匿名类型
///
[Description("匿名类型")]
Anonymous = 12,
///
/// DataTable
///
[Description("DataTable")]
DataTable = 13,
///
/// 其它
///
[Description("其它")]
Other = 20
}
```
# 字符串匹配提取
### 用法实例
IsMatch 当前扩展方法 主要是 当前字符串是否匹配上正则表达式,比如,匹配当前字符串是否是QQ号码,代码如下:
```csharp
if("7092734".IsMatch(@"^\d{5-11}$"))
Console.WriteLine("是QQ号码格式.");
else
Console.WriteLine("非QQ号码格式.");
```
输出结果为:是QQ号码格式.
因为 字符串 "7092734"确实是QQ号码。
IsNotMatch 当前方法其实就是 !IsMatch,用法和IsMatch用法一样。
Match 当前扩展方法返回的是Match,使用指定的匹配选项在输入字符串中搜索指定的正则表达式的第一个匹配项。
Matches 当前扩展方法返回的是使用指定的匹配选项在指定的输入字符串中搜索指定的正则表达式的所有匹配项。
这三个方法是最原始最底层的方法,其它扩展都基于当前三个方法中的一个或两个来实现的。
GetMatch 扩展方法返回结果是:提取符合模式的数据所匹配的第一个匹配项所匹配的第一项或a组的数据
GetPatterns 扩展方法返回结果是:提取符合模式的数据所有匹配的第一项数据或a组数据
GetMatchs 扩展方法返回结果是:提取符合模式的数据所匹配的第一项中所有组数据
GetMatches 扩展方法返回结果是:提取符合模式的数据所有匹配项或所有组数据
提取的数据量对比:GetMatch < GetMatchs < GetPatterns < GetMatches
ReplacePattern 扩展方法用途是 使用 正则达式 来替换数据
下边通过实例来讲解这几个方法的使用及返回结果的区别:
```csharp
var a = "abc4d5e6hh5654".GetMatch(@"\d+");
a的值为:"4";
var b = "abc4d5e6hh5654".GetPatterns(@"\d+");
b的值为:["4","5","6","5654"];
var c = "abc4d5e6hh5654".GetMatchs(@"(?[a-z]+)(?\d+)");
c的值为:{{"a","abc"},{"b","4"}};
var d = "abc4d5e6hh5654".GetMatches(@"(?[a-z]+)(?\d+)");
d的值为:[{{"a","abc"},{"b","4"}},{{"a","d"},{"b","5"}},{{"a","e"},{"b","6"}},{{"a","hh"},{"b","5654"}}]
var g = "a6b9c53".ReplacePattern(@"\d+","g");
g的值为:"agbgcg";
var h = "a6b7c56".RemovePattern(@"\d+");
h的值为:"abc";
var i = "a1b2c3".ReplacePattern(@"\d+",m=>{
var a = a.Groups["a"].Value;
if(a == "1")return "a1";
else return "a2";
});
i的值为:"aa1ba2ca2";
```
## 数字转换成大写数字 ToChineseNumber和ToNumber
### 用法实例
``` csharp
var a = "123456789.1234";
//转换成大写
var b = a.ToChineseNumber();
//输出结果为 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖点壹贰叁肆
//转换成大写人民币
var c = a.ToChineseNumber(UpperType.Money);
//输出结果为 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖圆壹分贰厘叁毫肆微
//大写转换成数字
var d = c.ToNumber();
//输出结果为 123456789.1234
//大写转换成数字并增加,格式
var e = c.ToNumber(true);
//输出结果为 123,456,789.1234
//数字转换成带,格式的数字
var f = "123456789.1235684".ToNumber(true);
//输出结果为 123,456,789.1235684
```
# 配置管理器 XiaoFeng.Config.ConfigSet<>
通过继承当前类可以轻松实现配置文件的操作,缓存,增,删,改,查等功能.
## 用法实例
XiaoFeng类库自动创建一个XiaoFeng.json配置文件 它的类库源码如下
```csharp
///
/// XiaoFeng总配置
///
[ConfigFile("Config/XiaoFeng.json", 0, "FAYELF-CONFIG-XIAOFENG", ConfigFormat.Json)]
public class Setting : ConfigSet, ISetting
{
#region 构造器
///
/// 无参构造器
///
public Setting() : base() { }
///
/// 设置配置文件名
///
///
public Setting(string fileName) : base(fileName) { }
#endregion
#region 属性
///
/// 是否启用调试
///
[Description("是否启用调试")]
public bool Debug { get; set; } = true;
///
/// 最大线程数量
///
[Description("最大线程数量")]
public int MaxWorkerThreads { get; set; } = 100;
///
/// 消费日志空闲时长
///
[Description("消费日志空闲时长")]
public int IdleSeconds { get; set; } = 60;
///
/// 任务队列执行任务超时时间
///
private int _TaskWaitTimeout = 5 * 60;
///
/// 任务队列执行任务超时时间
///
[Description("任务队列执行任务超时时间")]
public int TaskWaitTimeout {
get
{
if (this._TaskWaitTimeout == 0)
this._TaskWaitTimeout = 10 * 1000;
return this._TaskWaitTimeout ;
}
set
{
this._TaskWaitTimeout = value;
}
}
///
/// 是否启用数据加密
///
[Description("是否启用数据加密")]
public bool DataEncrypt { get; set; } = false;
///
/// 加密数据key
///
[Description("加密数据key")]
public string DataKey { get; set; } = "7092734";
///
/// 是否开启请求日志
///
[Description("是否开启请求日志")]
public bool ServerLogging { get; set; }
///
/// 是否拦截
///
[Description("是否拦截")]
public bool IsIntercept { get; set; }
///
/// SQL注入串
///
[Description("SQL注入串")]
public string SQLInjection { get; set; } = @"insert\s+into |update |delete |select | union | join |exec |execute | exists|'|truncate |create |drop |alter |column |table |dbo\.|sys\.|alert\(||