CleanEngine.Shared.Extension
5.0.0
dotnet add package CleanEngine.Shared.Extension --version 5.0.0
NuGet\Install-Package CleanEngine.Shared.Extension -Version 5.0.0
<PackageReference Include="CleanEngine.Shared.Extension" Version="5.0.0" />
<PackageVersion Include="CleanEngine.Shared.Extension" Version="5.0.0" />
<PackageReference Include="CleanEngine.Shared.Extension" />
paket add CleanEngine.Shared.Extension --version 5.0.0
#r "nuget: CleanEngine.Shared.Extension, 5.0.0"
#:package CleanEngine.Shared.Extension@5.0.0
#addin nuget:?package=CleanEngine.Shared.Extension&version=5.0.0
#tool nuget:?package=CleanEngine.Shared.Extension&version=5.0.0
CleanEngine.Shared.Extension
CleanEngine.Shared.Extension is an extension for commonly used functions and rapid development.
Extension for value types convert methods
int integerNum = "123".ToInt32();//123
double longNum = "123.456".ToDouble();//123.456
decimal roundDecimal = 123.456m.ToRound(2);//123.46
double roundDouble = 123.456d.ToRound(2);//123.46
Extension for json convert
var json = new { Id = 1, Name = "Levi" }.ToJson();//{"Id":1,"Name":"Levi"}
var obj = "{\"Id\":1,\"Name\":\"Levi\"}".ToObject<Student>();
string result = "{\"name\":\"levi\", \"age\":18}".JsonAppendNode("person", new Person(Address: "shenzhen", Count: 100));
Extension for datetime convert
string now = DateTime.Now.ToStandardString();//2024-03-27 16:32:10
Extension for string
bool isEmpty = "".IsEmpty();//true
bool isNotEmpty = "".IsNotEmpty();//false
bool isEqual = "abc".EqualsIgnoreCase("ABC");//true
bool isNumber = "123".IsNumber();//true
bool isInteger = "123.12".IsInteger();//false
bool isDateTime = "2024-03-27".IsDateTime();//true
bool isPhoneNumber = "13800000000".IsPhoneNumber();//true
bool isEmail = "abc@example.com".IsEmail();//true
bool isChineseCharacter="中国".IsChineseCharacter();//true
bool isEnglishCharacter = "abc".IsEnglishCharacter();//true
bool isIntegerAndEnglishCharacter = "abc123".IsIntegerAndEnglishCharacter();//true
bool containsIgnoreCase = "ABC".ContainsIgnoreCase("abc");//true
bool isUrl = "https://www.google.com".IsUrl();//true
Extension for IEnumerable
var list = new List<string>() { "abc", "efg", "ggg" };
foreach (var item in list.WithIndex<string>())
{
var index = item.Index;//get index from collection
var value = item.Item;
}
var isEmpty = list.IsNullOrEmpty();//false
var isNotEmpty = list.IsNotNullOrEmpty();//true
File Helper
FilesHelper.AppendOrCreate("x:\\xxx\\xxx.txt", text);//if file not exists, create; And then write text
FilesHelper.AppendOrCreate("x:\\xxx\\xxx.txt", new List<string>() { "123", "456" }););//if file not exists, create; And then write text
HttpClient Helper
One statement for HttpGet/HttpPost (Below version v1.3.0)
//with header
var html = new HttpEngine().GetString("https://www.baidu.com", x=>x.WithHeader("Accept-Language", "zh-CN"));
//with headers
var html2 = new HttpEngine().GetString("https://www.baidu.com", x => x.WithHeaders(new
{
Host = "www.baidu.com",
Connection= "keep-alive"
}));
//response convert to Object
var obj = new HttpEngine().Post<Employee>("http://192.168.1.1", x=>x.WithBearerToken("token"));
//response convert to List
List<Employee> list = new HttpEngine().PostList<Employee>("http://192.168.1.1");
(Below v3.0.0 and Equal / above version v1.3.0)
var html = new HttpEngineBuilder().Build().PostString("https://www.baidu.com");
var result = new HttpEngineBuilder().AddRequestBody(x => x.WithObject(new
{
password = "password",
userCode = "user"
})).Build().PostString("http://192.168.1.1:8888/api/login");
var html = _httpEngineBuilder.AddRequestHeader(x => x.WithHeaders(new
{
Host = "www.baidu.com",
Connection = "keep-alive"
})).Build().GetString("https://www.baidu.com");
var result = new HttpEngineBuilder().AddRequestBody(x => x.WithObject(new
{
password = "password",
userCode = "user"
})).Build().PostString<TestResponse>("http://192.168.1.1:8888/api/login");
(Equal and above version v3.0.0)
(v3.0.0版本及以上)
//.net framework
var html = new HttpBuilder().PostString("https://www.baidu.com");
var httpBuilder = new HttpBuilder();
var result = new HttpBuilder().AddRequestBody(x => x.WithObject(new
{
password = "password",
userCode = "user"
})).PostString("http://192.168.1.1:8888/api/login");
var html = new HttpBuilder().AddRequestHeader(x => x.WithHeaders(new
{
Host = "www.baidu.com",
Connection = "keep-alive"
})).GetString("https://www.baidu.com");
var result = new HttpBuilder().AddRequestBody(x => x.WithObject(new
{
password = "password",
userCode = "user"
})).PostString<TestResponse>("http://192.168.1.1:8888/api/login");
//.net core
//.net8 demo:
//register
builder.Services.AddHttpClient();
builder.Services.AddScoped<IHttpEngineAdapter, HttpEngineAdapter>();
builder.Services.AddScoped<IHttpBuilder, HttpBuilder>();
//add adapter class for use HttpClientFactory
public class HttpEngineAdapter : IHttpEngineAdapter
{
private IHttpClientFactory _httpClientFactory;
public HttpEngineAdapter(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public HttpClient CreateHttpClient(string name = null, DelegatingHandler handler = null)
{
if (name == null)
return _httpClientFactory.CreateClient();
return _httpClientFactory.CreateClient(name);
}
}
//DI
[ApiController]
[Route("[controller]")]
public class DebugController : ControllerBase
{
private IHttpBuilder _httpBuilder;
public DebugController(IHttpBuilder httpBuilder)
{
_httpBuilder = httpBuilder;
}
[HttpPost("GetHtml")]
public async Task<string> GetHtml()
{
return await _httpBuilder.AddRequestHeader(x => x.WithObject(new
{
PageSize = 100,
PageNumber = 1,
Condition = "Product"
})).GetStringAsync("https://www.example.com");
}
[HttpPost("login")]
public async Task<IActionResult> login()
{
//request by header easily
var result = await _httpBuilder
//.AddClientHandler(x=>x.WithClientName("system"))
.AddRequestHeader(x=>x.WithHeader("authorization", "Bearer HereIsYourBearerToken"))
.GetStringAsync("https://www.example.com");
return Ok(result);
}
}
(Equal and above version v3.0.1)
(v3.0.1版本及以上)
var httpBuilder = new HttpBuilder();
var result = httpBuilder.AddRequestHeader(x => x.WithHeaders(new
{
Host = "www.baidu.com",
Connection = "keep-alive"
})).GetString("https://www.baidu.com");
var afterClear = httpBuilder.Clear().GetString("https://www.baidu.com");//Clear all settings(Headers...) before request
Snowflake Id Generator
long id = IdGenerator.DefaultInstance().NextId();//163697223064879104 Generate a snowflake id
long distributedId = new IdGenerator(1,1).NextId();//163697287460163584 Generate a distibuted snowflake id with distibuted configuration
Reflection Helper
var dept = new Department() { Id = 1, Name = "it" };
string beforValue = ReflectionHelper.SetProperty<Department>(dept, "Name", "hr");//set property by key, value
v3.0.2
Map Helper
public class A
{
public string Name { get; set; }
public long Id { get; set; }
}
public class B
{
[MapIgnore] //忽略映射字段
public string Name { get; set; }
public long Id { get; set; }
}
B mapToB = MapHelper.Map(new A { Id = 1, Name = "levi" }, typeof(B));
生成密钥
//简便:生成指定长度的随机数
byte[] keyBytes = EncryptHelper.GenerateRandomNumber(16);
byte[] ivBytes = EncryptHelper.GenerateRandomNumber(16);
//复杂:使用key、盐值、迭代次数,生成指定长度密钥
var salt = new byte[16];
byte[] passwordKey = EncryptHelper.GeneratePasswordKey(10, keyBytes, salt, 1000);//130,163,128,38,80,169,37,215,26,103
Base64
var base64 = EncodeHelper.ToBase64Encode("123456");//MTIzNDU2
var plainString = EncodeHelper.ToBase64Decode(base64);//"123456"
MD5
var md5 = HashHelper.ToMd5Hash("123456");//"e10adc3949ba59abbe56e057f20f883e"
SHA256
var sha236 = HashHelper.ToSha256Hash("123456");//"8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92"
AES
string plainText = "Hello, World";
byte[] keyBytes = EncryptHelper.GenerateRandomNumber(16);
byte[] ivBytes = EncryptHelper.GenerateRandomNumber(16);
//AES 加密
//CBC mode
string encryptedTextCBC = EncryptHelper.AesEncrypt(plainText, keyBytes, ivBytes, CipherMode.CBC);
string decryptedTextCBC = EncryptHelper.AesDecrypt(encryptedTextCBC, keyBytes, ivBytes, CipherMode.CB
//default ECB mode, ECB mode does not use IV
string encryptedTextECB = EncryptHelper.AesEncrypt(plainText, keyBytes, null);
string decryptedTextECB = EncryptHelper.AesDecrypt(encryptedTextECB, keyBytes, null);//Hello, World
v3.2.1
//简化请求体为json字符串的调用
var json = """
{
"name": "John Doe",
"age": 30
}
""";
var result = new HttpBuilder().AddRequestBody(x => x.WithJsonString(json)).PostString("http://localhost:5021/test/do");
v3.3.0
//修复Send、SendAsync方法发送失败的问题
var result = httpBuilder
.AddRequestLine(x => x.WithHttpMethod(HttpMethod.Post))
.AddRequestBody(x => x.WithJsonString(json))
.AddRequestTimeout(x => x.WithTimeoutSecond(60 * 40))
.Send("http://localhost:5021/test/do");
v3.3.1
var source = new Source { Id = 1, Name = "Test" };
var target = MapHelper.Mapper<Source,Target>.Map(source);
v3.3.2
add PageHelper
var pageCount = PageHelper.GetTotalPages(101, 10); //pageCount = 11
v3.3.3 fix bug: IdGenerator 超过2038年产生负值的问题
v4.0.0 JsonExtension的初始化优化
// JsonExtension的JsonSerializerSettings初始化从原来的:
CleanEngine.Shared.Extension.Extensions.JsonExtension.DefaultJsonSetting = new Newtonsoft.Json.JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind, // 保持时区信息
DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
Culture = CultureInfo.InvariantCulture
};
//变更为
CleanEngine.Shared.Extension.Extensions.JsonExtension.InitDefaultJsonSetting(new Newtonsoft.Json.JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind, // 保持时区信息
DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
Culture = CultureInfo.InvariantCulture
});
v5.0.0 雪花id起始时间Twepoch从1970调整到2026-01-01 00:00:00 旧项目如升级,请同时更改DataCenterId(数据中心ID)、和MachineId(机器Id),避免Id重复
如将
"IdGeneratorConfig": {
"DataCenterId": 1,
"WorkerId": 1
}
变更为
"IdGeneratorConfig": {
"DataCenterId": 1,
"WorkerId": 2
}
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Newtonsoft.Json (>= 13.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.0.0 | 104 | 8/15/2026 |
| 4.0.0 | 92 | 8/11/2026 |
| 3.3.3 | 96 | 8/8/2026 |
| 3.3.2 | 231 | 6/19/2025 |
| 3.3.0 | 337 | 3/6/2025 |
| 3.2.1 | 286 | 3/6/2025 |
| 3.1.0 | 196 | 12/1/2024 |
| 3.0.2 | 207 | 10/27/2024 |
| 3.0.1-beta | 187 | 9/23/2024 |
| 3.0.0-beta | 174 | 9/14/2024 |
| 2.1.0-beta | 161 | 9/14/2024 |
| 2.0.2 | 220 | 8/23/2024 |
| 2.0.1 | 184 | 7/23/2024 |
| 2.0.0 | 203 | 7/13/2024 |
| 1.3.2 | 206 | 7/6/2024 |
| 1.3.1 | 191 | 6/30/2024 |
| 1.3.0 | 170 | 6/29/2024 |
| 1.2.5 | 198 | 5/27/2024 |
| 1.2.4 | 199 | 4/15/2024 |