2 Commits

Author SHA1 Message Date
52b3170e10 bugfix 2023-01-04 18:12:44 +08:00
f3d0f98970 <fix> 2022-12-27 16:14:38 +08:00
8 changed files with 65 additions and 97 deletions

View File

@ -1,8 +1,4 @@
<wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve"> <wpf:ResourceDictionary xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xml:space="preserve">
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/ReSpeller/ReSpellerEnabled/@EntryValue">False</s:Boolean> <s:Boolean x:Key="/Default/ReSpeller/ReSpellerEnabled/@EntryValue">False</s:Boolean>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_CODE/@EntryValue">1</s:Int64> <s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_CODE/@EntryValue">1</s:Int64>
<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue">1</s:Int64> <s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue">1</s:Int64>

View File

@ -1,27 +1,27 @@
# ns-ext # ns-ext
[](README.zh-CN.md) | **En** [](README.zh-CN.md) | **En**
The **ns-ext** is a .NET extension function library, containing the following types of extension modules: The **ns-ext** is a .NET extension function library, containing the following types of extension modules:
| Features | File name |
|------------------------------------------|------------------------------------| | Features | File name |
| Byte type extension | ByteExtensions.cs | | -------- | ---------------------------------- |
| Character Type Extensions | CharExtensions.cs | | Byte type extension | ByteExtensions.cs |
| Date Type Extensions | DateTimeExtensions.cs | | Character Type Extensions | CharExtensions.cs |
| Database command type extension | DbCommandExtensions.cs | | Date Type Extensions | DateTimeExtensions.cs |
| Decimal Number Type extension | DecimalExtensions.cs | | Database command type extension | DbCommandExtensions.cs |
| Enumable type extension | EnumerableExtensions.cs | | Decimal Number Type extension | DecimalExtensions.cs |
| Enumeration type extension | EnumExtensions.cs | | Enumable type extension | EnumerableExtensions.cs |
| General type extension | GenericExtensions.cs | | Enumeration type extension | EnumExtensions.cs |
| Integer type extension | IntExtensions.cs | | General type extension | GenericExtensions.cs |
| Integer type extension | IntExtensions.cs |
| Json Serialization option type extension | JsonSerializerOptionsExtensions.cs | | Json Serialization option type extension | JsonSerializerOptionsExtensions.cs |
| Log type extension | LoggerExtensions.cs | | Log type extension | LoggerExtensions.cs |
| Long integer extension | LongExtensions.cs | | Long integer extension | LongExtensions.cs |
| Object type extension | ObjectExtensions.cs | | Object type extension | ObjectExtensions.cs |
| Stream type extension | StreamExtensions.cs | | Stream type extension | StreamExtensions.cs |
| String type extension | StringExtensions.cs | | String type extension | StringExtensions.cs |
| Prototype type extension | TypeExtensions.cs | | Prototype type extension | TypeExtensions.cs |
| Resource locator type extension | UriExtensions.cs | | Resource locator type extension | UriExtensions.cs |
## Quick start ## Quick start

13
src/Constant/Regexes.cs Normal file
View File

@ -0,0 +1,13 @@
namespace NSExt.Constant;
#pragma warning disable SYSLIB1045
// 使用 RegexGenerator 新特性会生成重复key值的xmlcomment导致出错
internal static class Regexes
{
public static readonly Regex RegexHtmlTag = new("<[^>]*>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public static readonly Regex RegexMobile
= new("^(\\d{3})\\d{4}(\\d{4})$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public static readonly Regex RegexUpLetter = new("([A-Z])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
}

View File

@ -42,20 +42,17 @@ public static class ByteExtensions
/// <param name="me">me</param> /// <param name="me">me</param>
/// <param name="upperCase">是否大写</param> /// <param name="upperCase">是否大写</param>
/// <param name="splitShar">字节间分隔符</param> /// <param name="splitShar">字节间分隔符</param>
/// <param name="splitInterval">分隔符跳跃字节数</param> public static string String(this byte[] me, bool upperCase = true, string splitShar = null)
public static string String(this IEnumerable<byte> me, bool upperCase = true, string splitShar = ""
, int splitInterval = 1)
{ {
var sb = new StringBuilder(); var ret = BitConverter.ToString(me);
var i = 0; if (!upperCase) {
foreach (var c in me.Select(x => x.ToString(upperCase ? "X2" : "x2", CultureInfo.InvariantCulture))) { ret = ret.ToLower(CultureInfo.InvariantCulture);
if (i++ % splitInterval == 0) {
sb.Append(splitShar);
}
sb.Append(c);
} }
return sb.ToString(); if (splitShar != "-") {
ret = ret.Replace("-", splitShar ?? string.Empty);
}
return ret;
} }
} }

View File

@ -1,7 +1,7 @@
namespace NSExt.Extensions; namespace NSExt.Extensions;
/// <summary> /// <summary>
/// DbCommandExtensions /// DbCommandExtensions
/// </summary> /// </summary>
public static class DbCommandExtensions public static class DbCommandExtensions
{ {
@ -15,30 +15,18 @@ public static class DbCommandExtensions
//应逆向替换,否则由于 多个表的过滤器问题导致替换不完整 如 @TenantId1 @TenantId10 //应逆向替换,否则由于 多个表的过滤器问题导致替换不完整 如 @TenantId1 @TenantId10
for (var i = me.Parameters.Count - 1; i >= 0; i--) { for (var i = me.Parameters.Count - 1; i >= 0; i--) {
#pragma warning disable IDE0072
sql = me.Parameters[i].DbType switch { sql = me.Parameters[i].DbType switch {
#pragma warning restore IDE0072
DbType.String or DbType.DateTime or DbType.Date or DbType.Time or DbType.DateTime2 DbType.String or DbType.DateTime or DbType.Date or DbType.Time or DbType.DateTime2
or DbType.DateTimeOffset or DbType.Guid or DbType.VarNumeric or DbType.AnsiStringFixedLength or DbType.DateTimeOffset or DbType.Guid or DbType.VarNumeric or DbType.AnsiStringFixedLength
or DbType.AnsiString or DbType.StringFixedLength => sql.Replace( // or DbType.AnsiString
me.Parameters[i].ParameterName, "'" + me.Parameters[i].Value + "'") or DbType.StringFixedLength =>
, DbType.Boolean => sql.Replace( // sql.Replace(me.Parameters[i].ParameterName, "'" + me.Parameters[i].Value + "'")
me.Parameters[i].ParameterName , DbType.Boolean => sql.Replace(//
, Convert.ToBoolean(me.Parameters[i].Value, CultureInfo.InvariantCulture) ? "1" : "0") me.Parameters[i].ParameterName
, DbType.Binary => throw new NotImplementedException() , Convert.ToBoolean(me.Parameters[i].Value, CultureInfo.InvariantCulture) ? "1" : "0")
, DbType.Byte => throw new NotImplementedException() , _ => sql.Replace(me.Parameters[i].ParameterName, me.Parameters[i].Value?.ToString())
, DbType.Currency => throw new NotImplementedException()
, DbType.Decimal => throw new NotImplementedException()
, DbType.Double => throw new NotImplementedException()
, DbType.Int16 => throw new NotImplementedException()
, DbType.Int32 => throw new NotImplementedException()
, DbType.Int64 => throw new NotImplementedException()
, DbType.Object => throw new NotImplementedException()
, DbType.SByte => throw new NotImplementedException()
, DbType.Single => throw new NotImplementedException()
, DbType.UInt16 => throw new NotImplementedException()
, DbType.UInt32 => throw new NotImplementedException()
, DbType.UInt64 => throw new NotImplementedException()
, DbType.Xml => throw new NotImplementedException()
, _ => sql.Replace(me.Parameters[i].ParameterName, me.Parameters[i].Value?.ToString())
}; };
} }

View File

@ -15,14 +15,12 @@ public static class JsonSerializerOptionsExtensions
public static JsonSerializerOptions NewJsonSerializerOptions(this JsonSerializerOptions _) public static JsonSerializerOptions NewJsonSerializerOptions(this JsonSerializerOptions _)
{ {
return new JsonSerializerOptions { return new JsonSerializerOptions {
ReadCommentHandling = JsonCommentHandling.Skip ReadCommentHandling = JsonCommentHandling.Skip
, AllowTrailingCommas = true , AllowTrailingCommas = true
, DictionaryKeyPolicy = JsonNamingPolicy.CamelCase , DictionaryKeyPolicy = JsonNamingPolicy.CamelCase
, PropertyNamingPolicy = JsonNamingPolicy.CamelCase , PropertyNamingPolicy = JsonNamingPolicy.CamelCase
, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping , Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
, NumberHandling , NumberHandling = JsonNumberHandling.AllowReadingFromString
= JsonNumberHandling.AllowReadingFromString |
JsonNumberHandling.WriteAsString
, PropertyNameCaseInsensitive = true , PropertyNameCaseInsensitive = true
}; };
} }

View File

@ -4,13 +4,14 @@
#pragma warning disable CA1720 #pragma warning disable CA1720
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text.Json; using System.Text.Json;
using NSExt.Constant;
namespace NSExt.Extensions; namespace NSExt.Extensions;
/// <summary> /// <summary>
/// StringExtensions /// StringExtensions
/// </summary> /// </summary>
public static partial class StringExtensions public static class StringExtensions
{ {
private static readonly JsonSerializerOptions _defaultJsonSerializerOptions private static readonly JsonSerializerOptions _defaultJsonSerializerOptions
= default(JsonSerializerOptions).NewJsonSerializerOptions(); = default(JsonSerializerOptions).NewJsonSerializerOptions();
@ -369,7 +370,7 @@ public static partial class StringExtensions
/// <returns>掩码后的手机号</returns> /// <returns>掩码后的手机号</returns>
public static string MaskMobile(this string me) public static string MaskMobile(this string me)
{ {
return RegexMobile().Replace(me, "$1****$2"); return Regexes.RegexMobile.Replace(me, "$1****$2");
} }
/// <summary> /// <summary>
@ -444,7 +445,7 @@ public static partial class StringExtensions
/// <returns>处理之后的字符串</returns> /// <returns>处理之后的字符串</returns>
public static string RemoveHtmlTag(this string me) public static string RemoveHtmlTag(this string me)
{ {
return RegexHtmlTag().Replace(me, string.Empty); return Regexes.RegexHtmlTag.Replace(me, string.Empty);
} }
/// <summary> /// <summary>
@ -473,7 +474,7 @@ public static partial class StringExtensions
/// </summary> /// </summary>
public static string Snakecase(this string me) public static string Snakecase(this string me)
{ {
return RegexUpperCaseLetter().Replace(me, "-$1").ToLower(CultureInfo.InvariantCulture).TrimStart('-'); return Regexes.RegexUpLetter.Replace(me, "-$1").ToLower(CultureInfo.InvariantCulture).TrimStart('-');
} }
/// <summary> /// <summary>
@ -507,16 +508,6 @@ public static partial class StringExtensions
return ret == me ? ret : ret.TrimSpaces(); return ret == me ? ret : ret.TrimSpaces();
} }
/// <summary>
/// 将\ux0000 、 %u0000 、 &amp;#x0000; 编码转换成可读字符串
/// </summary>
public static string UnicodeDe(this string me)
{
const string replacement = "&#x$1;";
return me.Contains(@"\u") ? RegexBacksLantUnicode().Replace(me, replacement).HtmlDe() :
me.Contains(@"%u") ? RegexPercentUnicode().Replace(me, replacement).HtmlDe() : me.HtmlDe();
}
/// <summary> /// <summary>
/// url编码 /// url编码
/// </summary> /// </summary>
@ -551,19 +542,4 @@ public static partial class StringExtensions
.Replace("-", string.Empty) .Replace("-", string.Empty)
.ToLower(CultureInfo.CurrentCulture); .ToLower(CultureInfo.CurrentCulture);
} }
[GeneratedRegex("\\\\u([a-fA-F0-9]{4})")]
private static partial Regex RegexBacksLantUnicode();
[GeneratedRegex("<[^>]*>")]
private static partial Regex RegexHtmlTag();
[GeneratedRegex("^(\\d{3})\\d{4}(\\d{4})$")]
private static partial Regex RegexMobile();
[GeneratedRegex("\\\\u([a-fA-F0-9]{4})")]
private static partial Regex RegexPercentUnicode();
[GeneratedRegex("([A-Z])")]
private static partial Regex RegexUpperCaseLetter();
} }

View File

@ -1,17 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net7.0</TargetFrameworks> <TargetFramework>net7.0</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0"/> <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
<PackageReference Include="MinVer" Version="4.3.0-beta.1"> <PackageReference Include="MinVer" Version="4.3.0-beta.1">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
<Import Project="../CodeQuality.props"/> <Import Project="../CodeQuality.props" />
</Project> </Project>