mirror of
https://github.com/nsnail/ns-ext.git
synced 2025-06-20 06:08:15 +08:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
371d0d11a5 | |||
13f8ae51c2 | |||
52b3170e10 | |||
f3d0f98970 | |||
485e7a0ead |
@ -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>
|
||||||
|
24
src/Attributes/LocalizationAttribute.cs
Normal file
24
src/Attributes/LocalizationAttribute.cs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
namespace NSExt.Attributes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 指定本地化资源类型
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Field)]
|
||||||
|
public class LocalizationAttribute : Attribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="LocalizationAttribute" /> class.
|
||||||
|
/// </summary>
|
||||||
|
public LocalizationAttribute(Type resourceClass)
|
||||||
|
{
|
||||||
|
ResourceClass = resourceClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets 资源类型
|
||||||
|
/// </summary>
|
||||||
|
/// <value>
|
||||||
|
/// 资源类型
|
||||||
|
/// </value>
|
||||||
|
public Type ResourceClass { get; set; }
|
||||||
|
}
|
19
src/Constant/Regexes.cs
Normal file
19
src/Constant/Regexes.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
namespace NSExt.Constant;
|
||||||
|
#pragma warning disable SYSLIB1045
|
||||||
|
|
||||||
|
// 使用 RegexGenerator 新特性会生成重复key值的xmlcomment导致出错
|
||||||
|
internal static class Regexes
|
||||||
|
{
|
||||||
|
public static readonly Regex RegexBacksLantUnicode
|
||||||
|
= new("\\\\u([a-fA-F0-9]{4})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
|
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 RegexPercentUnicode
|
||||||
|
= new("\\\\u([a-fA-F0-9]{4})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
|
public static readonly Regex RegexUpLetter = new("([A-Z])", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
|
}
|
@ -15,29 +15,17 @@ 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 + "'")
|
||||||
|
, DbType.Boolean => sql.Replace(//
|
||||||
me.Parameters[i].ParameterName
|
me.Parameters[i].ParameterName
|
||||||
, Convert.ToBoolean(me.Parameters[i].Value, CultureInfo.InvariantCulture) ? "1" : "0")
|
, Convert.ToBoolean(me.Parameters[i].Value, CultureInfo.InvariantCulture) ? "1" : "0")
|
||||||
, DbType.Binary => throw new NotImplementedException()
|
|
||||||
, DbType.Byte => throw new NotImplementedException()
|
|
||||||
, 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())
|
, _ => sql.Replace(me.Parameters[i].ParameterName, me.Parameters[i].Value?.ToString())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using NSExt.Attributes;
|
||||||
|
|
||||||
namespace NSExt.Extensions;
|
namespace NSExt.Extensions;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -14,7 +17,13 @@ public static class EnumExtensions
|
|||||||
{
|
{
|
||||||
var t = e.GetType();
|
var t = e.GetType();
|
||||||
var fi = t.GetField(Enum.GetName(t, e)!);
|
var fi = t.GetField(Enum.GetName(t, e)!);
|
||||||
var attrs = (DescriptionAttribute[])fi!.GetCustomAttributes(typeof(DescriptionAttribute), false);
|
var descAttr = fi!.GetCustomAttribute<DescriptionAttribute>(false);
|
||||||
return (attrs.Length != 0 ? attrs[0].Description : Enum.GetName(t, e)) ?? string.Empty;
|
if (descAttr is null) {
|
||||||
|
return Enum.GetName(t, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
var str = descAttr.Description;
|
||||||
|
var locAttr = fi!.GetCustomAttribute<LocalizationAttribute>(false);
|
||||||
|
return locAttr is null ? str : locAttr.ResourceClass.GetProperty(str)?.GetValue(default) as string ?? str;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,9 +20,7 @@ public static class JsonSerializerOptionsExtensions
|
|||||||
, 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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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>
|
||||||
@ -513,8 +514,8 @@ public static partial class StringExtensions
|
|||||||
public static string UnicodeDe(this string me)
|
public static string UnicodeDe(this string me)
|
||||||
{
|
{
|
||||||
const string replacement = "&#x$1;";
|
const string replacement = "&#x$1;";
|
||||||
return me.Contains(@"\u") ? RegexBacksLantUnicode().Replace(me, replacement).HtmlDe() :
|
return me.Contains(@"\u") ? Regexes.RegexBacksLantUnicode.Replace(me, replacement).HtmlDe() :
|
||||||
me.Contains(@"%u") ? RegexPercentUnicode().Replace(me, replacement).HtmlDe() : me.HtmlDe();
|
me.Contains(@"%u") ? Regexes.RegexPercentUnicode.Replace(me, replacement).HtmlDe() : me.HtmlDe();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -551,19 +552,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();
|
|
||||||
}
|
}
|
@ -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>
|
Reference in New Issue
Block a user