mirror of
				https://github.com/nsnail/ns-ext.git
				synced 2025-10-31 23:15:28 +08:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
			1.1.0
			...
			8c1083f732
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8c1083f732 | |||
| 31e31c5d49 | |||
| 3095dc783e | |||
| 9ae1046dca | |||
| cb63791dbc | |||
| 3a1a71d1c1 | |||
| 54082a82f1 | |||
| 1ea481e749 | |||
| d9aae8fe95 | 
| @@ -10,32 +10,18 @@ indent_style = space | |||||||
| insert_final_newline = false | insert_final_newline = false | ||||||
| trim_trailing_whitespace = true | trim_trailing_whitespace = true | ||||||
|  |  | ||||||
| [{*.json,*.yml}] |  | ||||||
| indent_size = 2 |  | ||||||
|  |  | ||||||
| [*.cs] | [*.cs] | ||||||
| dotnet_analyzer_diagnostic.severity = warning | dotnet_analyzer_diagnostic.severity = warning | ||||||
| dotnet_diagnostic.CA1200.severity = none |  | ||||||
| dotnet_diagnostic.CA1707.severity = none | dotnet_diagnostic.CA1707.severity = none | ||||||
| dotnet_diagnostic.CA1716.severity = none | dotnet_diagnostic.CA1720.severity = none | ||||||
| dotnet_diagnostic.IDE0005.severity = none | dotnet_diagnostic.CA5350.severity = none | ||||||
|  | dotnet_diagnostic.CA5351.severity = none | ||||||
| dotnet_diagnostic.IDE0008.severity = none | dotnet_diagnostic.IDE0008.severity = none | ||||||
| dotnet_diagnostic.IDE0010.severity = none | dotnet_diagnostic.IDE0017.severity = none | ||||||
|  | dotnet_diagnostic.IDE0048.severity = none | ||||||
| dotnet_diagnostic.IDE0055.severity = none | dotnet_diagnostic.IDE0055.severity = none | ||||||
|  | dotnet_diagnostic.IDE0058.severity = none | ||||||
| dotnet_diagnostic.IDE0160.severity = none | dotnet_diagnostic.IDE0160.severity = none | ||||||
| dotnet_diagnostic.IDE0270.severity = none |  | ||||||
| dotnet_diagnostic.RCS1141.severity = none |  | ||||||
| dotnet_diagnostic.RCS1142.severity = none |  | ||||||
| dotnet_diagnostic.RCS1181.severity = none |  | ||||||
| dotnet_diagnostic.RCS1186.severity = none |  | ||||||
| dotnet_diagnostic.S101.severity = none |  | ||||||
| dotnet_diagnostic.S1121.severity = none |  | ||||||
| dotnet_diagnostic.S1199.severity = none |  | ||||||
| dotnet_diagnostic.S125.severity = none |  | ||||||
| dotnet_diagnostic.S2094.severity = none |  | ||||||
| dotnet_diagnostic.S3925.severity = none |  | ||||||
| dotnet_diagnostic.S4663.severity = none |  | ||||||
| dotnet_diagnostic.SYSLIB1045.severity = none |  | ||||||
|  |  | ||||||
|  |  | ||||||
| # ReSharper properties | # ReSharper properties | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -29,7 +29,7 @@ x86/ | |||||||
| bld/ | bld/ | ||||||
| [Bb]in/ | [Bb]in/ | ||||||
| [Oo]bj/ | [Oo]bj/ | ||||||
| # [Ll]og/ | [Ll]og/ | ||||||
| [Ll]ogs/ | [Ll]ogs/ | ||||||
|  |  | ||||||
| # Visual Studio 2015/2017 cache/options directory | # Visual Studio 2015/2017 cache/options directory | ||||||
| @@ -399,7 +399,6 @@ FodyWeavers.xsd | |||||||
| .idea/ | .idea/ | ||||||
|  |  | ||||||
| # User Define | # User Define | ||||||
| dist/ | build/ | ||||||
| refs/ | nuget.config | ||||||
| *.[Dd]esigner.cs | *.[Dd]esigner.cs | ||||||
| *.db |  | ||||||
| @@ -1,4 +1,4 @@ | |||||||
| [hook "startcommit"] | [hook "startcommit"] | ||||||
|     cmdline = dot.clean.cmd |     cmdline = code-format.cmd | ||||||
|     wait = true |     wait = true | ||||||
|     show = true |     show = true | ||||||
							
								
								
									
										14
									
								
								AddMetaFilesToSln.csx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								AddMetaFilesToSln.csx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | using System.Text.RegularExpressions; | ||||||
|  |  | ||||||
|  | var slnFile = Directory.GetFiles(@".", "*.sln").First(); | ||||||
|  |         var content = File.ReadAllText(slnFile); | ||||||
|  |         content = Regex.Replace(content,@"ProjectSection\(SolutionItems\) = preProject(?:.|\n)*?EndProjectSection", | ||||||
|  |         $""" | ||||||
|  | ProjectSection(SolutionItems) = preProject | ||||||
|  | {string.Join('\n', | ||||||
|  |              Directory.GetFiles(@".", "*").Where(x => !x.EndsWith(".sln")) | ||||||
|  |                       .Select(x=>$"\t\t{Path.GetFileName(x)} = {Path.GetFileName(x)}"))} | ||||||
|  | {'\t'}EndProjectSection | ||||||
|  | """); | ||||||
|  |         Console.WriteLine(content); | ||||||
|  |         File.WriteAllText(slnFile, content); | ||||||
							
								
								
									
										16
									
								
								CodeCleanupOnSave.csx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								CodeCleanupOnSave.csx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | |||||||
|  | var path = Directory.GetFiles(@".idea", "workspace.xml", SearchOption.AllDirectories).First(); | ||||||
|  |         const string findStr = """ | ||||||
|  | "keyToString": { | ||||||
|  | """; | ||||||
|  |         const string replaceStr = """ | ||||||
|  | "keyToString": { | ||||||
|  |     "rider.code.cleanup.on.save": "true", | ||||||
|  | """; | ||||||
|  |         var content = File.ReadAllText(path); | ||||||
|  |         if(content.Contains("rider.code.cleanup.on.save")){ | ||||||
|  |                 Console.WriteLine("alreay added"); | ||||||
|  |                 return; | ||||||
|  |         } | ||||||
|  |         content = content.Replace(findStr, replaceStr); | ||||||
|  |         Console.WriteLine(content); | ||||||
|  |         File.WriteAllText(path, content); | ||||||
							
								
								
									
										17
									
								
								CodeQuality.props
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								CodeQuality.props
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | <Project> | ||||||
|  |     <PropertyGroup> | ||||||
|  |         <CodeAnalysisRuleSet>../StyleCopAnalyzers.ruleset</CodeAnalysisRuleSet> | ||||||
|  |         <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors> | ||||||
|  |         <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> | ||||||
|  |         <MSBuildTreatWarningsAsErrors>true</MSBuildTreatWarningsAsErrors> | ||||||
|  |         <MSBuildWarningsAsErrors>true</MSBuildWarningsAsErrors> | ||||||
|  |         <TreatWarningsAsErrors>true</TreatWarningsAsErrors> | ||||||
|  |         <WarningsAsErrors>true</WarningsAsErrors> | ||||||
|  |     </PropertyGroup> | ||||||
|  |     <ItemGroup> | ||||||
|  |         <PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.435"> | ||||||
|  |             <PrivateAssets>all</PrivateAssets> | ||||||
|  |             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |         </PackageReference> | ||||||
|  |     </ItemGroup> | ||||||
|  | </Project> | ||||||
| @@ -1,26 +1,22 @@ | |||||||
| <Project> | <Project> | ||||||
|     <PropertyGroup> |     <PropertyGroup> | ||||||
|         <!--        $(XXX) 定义有顺序 排序请注意--> |  | ||||||
|         <SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir> |  | ||||||
|         <Authors>nsnail</Authors> |  | ||||||
|         <BaseIntermediateOutputPath>$(SolutionDir)/dist/$(MSBuildProjectName)/obj</BaseIntermediateOutputPath> |  | ||||||
|         <BaseOutputPath>$(SolutionDir)/dist/$(MSBuildProjectName)/bin</BaseOutputPath> |  | ||||||
|         <Copyright>© 2006-2023 nsnail</Copyright> |  | ||||||
|         <Description>A .NET extension function library</Description> |  | ||||||
|         <EnableBaseIntermediateOutputPathMismatchWarning>false</EnableBaseIntermediateOutputPathMismatchWarning> |  | ||||||
|         <GenerateDocumentationFile>true</GenerateDocumentationFile> |  | ||||||
|         <ImplicitUsings>enable</ImplicitUsings> |         <ImplicitUsings>enable</ImplicitUsings> | ||||||
|         <MinVerDefaultPreReleaseIdentifiers>beta</MinVerDefaultPreReleaseIdentifiers> |         <BaseOutputPath>../dist</BaseOutputPath> | ||||||
|  |         <BaseIntermediateOutputPath>../dist</BaseIntermediateOutputPath> | ||||||
|  |         <OutputPath>$(BaseOutputPath)/$(MSBuildProjectName)/bin</OutputPath> | ||||||
|  |         <IntermediateOutputPath>$(BaseIntermediateOutputPath)/$(MSBuildProjectName)/obj</IntermediateOutputPath> | ||||||
|  |         <MSBuildProjectExtensionsPath>$(BaseIntermediateOutputPath)/$(MSBuildProjectName)/obj</MSBuildProjectExtensionsPath> | ||||||
|  |         <Authors>nsnail</Authors> | ||||||
|         <Product>NSExt</Product> |         <Product>NSExt</Product> | ||||||
|         <RepositoryType>git</RepositoryType> |         <Copyright>© 2006-2022 nsnail</Copyright> | ||||||
|         <RepositoryUrl>https://github.com/nsnail/NSExt.git</RepositoryUrl> |         <RepositoryUrl>https://github.com/nsnail/ns-ext.git</RepositoryUrl> | ||||||
|         <TargetFrameworks>net7.0;net8.0</TargetFrameworks> |         <PublishRepositoryUrl>true</PublishRepositoryUrl> | ||||||
|         <Title>$(AssemblyName)</Title> |         <EmbedUntrackedSource>true</EmbedUntrackedSource> | ||||||
|  |         <EmbedAllSources>true</EmbedAllSources> | ||||||
|  |         <RepositoryType>Git</RepositoryType> | ||||||
|  |         <IncludeSymbols>true</IncludeSymbols> | ||||||
|  |         <SymbolPackageFormat>snupkg</SymbolPackageFormat> | ||||||
|  |         <PackageLicenseExpression>MIT</PackageLicenseExpression> | ||||||
|  |         <PackageProjectUrl>https://github.com/nsnail/ns-ext.git</PackageProjectUrl> | ||||||
|     </PropertyGroup> |     </PropertyGroup> | ||||||
|     <ItemGroup> |  | ||||||
|         <PackageReference Include="MinVer" Version="5.0.0-alpha.1"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|     </ItemGroup> |  | ||||||
| </Project> | </Project> | ||||||
							
								
								
									
										45
									
								
								ImageOptimize.csx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								ImageOptimize.csx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | /* | ||||||
|  |             for %%i in (*.png) do pngquant %%i --force --output %%i --skip-if-larger | ||||||
|  |             for %%i in (*.jpg) do jpegtran -copy none -optimize -perfect %%i %%i | ||||||
|  |          * | ||||||
|  |          */ | ||||||
|  |  | ||||||
|  |         var files = Directory.EnumerateFiles(".", "*.png" | ||||||
|  |                                            , new EnumerationOptions { | ||||||
|  |                                                                         RecurseSubdirectories = true | ||||||
|  |                                                                       , AttributesToSkip = FileAttributes.ReparsePoint | ||||||
|  |                                                                       , IgnoreInaccessible = true | ||||||
|  |                                                                     }) | ||||||
|  |                              .ToArray(); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         Parallel.ForEach(files, file => { | ||||||
|  |             var startInfo = new ProcessStartInfo { | ||||||
|  |                                                      FileName = "pngquant" | ||||||
|  |                                                    , Arguments | ||||||
|  |                                                          = $"\"{file}\" --force --output \"{file}\" --skip-if-larger" | ||||||
|  |                                                  }; | ||||||
|  |             using var p = Process.Start(startInfo); | ||||||
|  |             p.WaitForExit(); | ||||||
|  |             Console.WriteLine($"{file}: {p.ExitCode}"); | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         files = new[] { "*.jpg", "*.jpeg" } | ||||||
|  |                 .SelectMany(x => Directory.EnumerateFiles( | ||||||
|  |                                 ".", x | ||||||
|  |                               , new EnumerationOptions { | ||||||
|  |                                                            RecurseSubdirectories = true | ||||||
|  |                                                          , AttributesToSkip      = FileAttributes.ReparsePoint | ||||||
|  |                                                          , IgnoreInaccessible    = true | ||||||
|  |                                                        })) | ||||||
|  |                 .ToArray(); | ||||||
|  |  | ||||||
|  |         Parallel.ForEach(files, file => { | ||||||
|  |             var startInfo = new ProcessStartInfo { | ||||||
|  |                                                      FileName  = "jpegtran" | ||||||
|  |                                                    , Arguments = $"-copy none -optimize -perfect \"{file}\" \"{file}\"" | ||||||
|  |                                                  }; | ||||||
|  |             using var p = Process.Start(startInfo); | ||||||
|  |             p.WaitForExit(); | ||||||
|  |             Console.WriteLine($"{file}: {p.ExitCode}"); | ||||||
|  |         }); | ||||||
							
								
								
									
										43
									
								
								NSExt.sln
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								NSExt.sln
									
									
									
									
									
								
							| @@ -3,39 +3,32 @@ Microsoft Visual Studio Solution File, Format Version 12.00 | |||||||
| # Visual Studio Version 17 | # Visual Studio Version 17 | ||||||
| VisualStudioVersion = 17.0.31903.59 | VisualStudioVersion = 17.0.31903.59 | ||||||
| MinimumVisualStudioVersion = 10.0.40219.1 | MinimumVisualStudioVersion = 10.0.40219.1 | ||||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{5198A03D-0CAC-4828-A807-34A693F73859}" | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NSExt", "src\NSExt.csproj", "{70DD1C27-7ACB-4BE0-A9CD-D781E4050DE5}" | ||||||
|  | EndProject | ||||||
|  | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{85E669CB-FC0A-4C1D-92DE-38D0662C257D}" | ||||||
| 	ProjectSection(SolutionItems) = preProject | 	ProjectSection(SolutionItems) = preProject | ||||||
| 		.editorconfig = .editorconfig | 		.editorconfig = .editorconfig | ||||||
| 		.gitattributes = .gitattributes | 		.gitattributes = .gitattributes | ||||||
| 		.gitignore = .gitignore | 		.gitignore = .gitignore | ||||||
| 		.tgitconfig = .tgitconfig | 		.tgitconfig = .tgitconfig | ||||||
|  | 		AddMetaFilesToSln.csx = AddMetaFilesToSln.csx | ||||||
| 		build.cake = build.cake | 		build.cake = build.cake | ||||||
| 		code.cleanup.full.ps1 = code.cleanup.full.ps1 | 		code-format.cmd = code-format.cmd | ||||||
| 		code.quality.props = code.quality.props | 		CodeCleanupOnSave.csx = CodeCleanupOnSave.csx | ||||||
|  | 		CodeQuality.props = CodeQuality.props | ||||||
| 		Directory.Build.props = Directory.Build.props | 		Directory.Build.props = Directory.Build.props | ||||||
| 		dot.clean.cmd = dot.clean.cmd | 		dot.sln.DotSettings = dot.sln.DotSettings | ||||||
| 		dotnet-tools.json = dotnet-tools.json | 		dotnet-tools.json = dotnet-tools.json | ||||||
| 		git.pr.ps1 = git.pr.ps1 | 		git-clean.cmd = git-clean.cmd | ||||||
| 		git.rc.ps1 = git.rc.ps1 |  | ||||||
| 		global.json = global.json | 		global.json = global.json | ||||||
| 		image.optimize.csx = image.optimize.csx | 		ImageOptimize.csx = ImageOptimize.csx | ||||||
| 		key.snk = key.snk |  | ||||||
| 		LICENSE = LICENSE | 		LICENSE = LICENSE | ||||||
| 		logo.png = logo.png | 		push2nuget.ps1 = push2nuget.ps1 | ||||||
| 		NSExt.sln.DotSettings = NSExt.sln.DotSettings |  | ||||||
| 		nuget.config = nuget.config |  | ||||||
| 		packable.props = packable.props |  | ||||||
| 		README.md = README.md | 		README.md = README.md | ||||||
| 		README.zh-CN.md = README.zh-CN.md |  | ||||||
| 		stylecop.analyzers.ruleset = stylecop.analyzers.ruleset |  | ||||||
| 		stylecop.json = stylecop.json | 		stylecop.json = stylecop.json | ||||||
| 		sync.metafiles.csx = sync.metafiles.csx | 		StyleCopAnalyzers.ruleset = StyleCopAnalyzers.ruleset | ||||||
| 	EndProjectSection | 	EndProjectSection | ||||||
| EndProject | EndProject | ||||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NSExt.Tests", "src\NSExt.Tests\NSExt.Tests.csproj", "{557FBEF6-E6D5-4531-86DF-D772A10E2261}" |  | ||||||
| EndProject |  | ||||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NSExt", "src\NSExt\NSExt.csproj", "{BA0982BE-6E57-4AAF-9778-F9B2EB46F505}" |  | ||||||
| EndProject |  | ||||||
| Global | Global | ||||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||||
| 		Debug|Any CPU = Debug|Any CPU | 		Debug|Any CPU = Debug|Any CPU | ||||||
| @@ -45,13 +38,9 @@ Global | |||||||
| 		HideSolutionNode = FALSE | 		HideSolutionNode = FALSE | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||||
| 		{557FBEF6-E6D5-4531-86DF-D772A10E2261}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | 		{70DD1C27-7ACB-4BE0-A9CD-D781E4050DE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||||
| 		{557FBEF6-E6D5-4531-86DF-D772A10E2261}.Debug|Any CPU.Build.0 = Debug|Any CPU | 		{70DD1C27-7ACB-4BE0-A9CD-D781E4050DE5}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||||
| 		{557FBEF6-E6D5-4531-86DF-D772A10E2261}.Release|Any CPU.ActiveCfg = Release|Any CPU | 		{70DD1C27-7ACB-4BE0-A9CD-D781E4050DE5}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||||
| 		{557FBEF6-E6D5-4531-86DF-D772A10E2261}.Release|Any CPU.Build.0 = Release|Any CPU | 		{70DD1C27-7ACB-4BE0-A9CD-D781E4050DE5}.Release|Any CPU.Build.0 = Release|Any CPU | ||||||
| 		{BA0982BE-6E57-4AAF-9778-F9B2EB46F505}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |  | ||||||
| 		{BA0982BE-6E57-4AAF-9778-F9B2EB46F505}.Debug|Any CPU.Build.0 = Debug|Any CPU |  | ||||||
| 		{BA0982BE-6E57-4AAF-9778-F9B2EB46F505}.Release|Any CPU.ActiveCfg = Release|Any CPU |  | ||||||
| 		{BA0982BE-6E57-4AAF-9778-F9B2EB46F505}.Release|Any CPU.Build.0 = Release|Any CPU |  | ||||||
| 	EndGlobalSection | 	EndGlobalSection | ||||||
| EndGlobal | EndGlobal | ||||||
| @@ -1,23 +1,5 @@ | |||||||
| <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:String x:Key="/Default/CodeEditing/GenerateMemberBody/DocumentationGenerationKind/@EntryValue">Inherit</s:String> |     <s:Boolean x:Key="/Default/ReSpeller/ReSpellerEnabled/@EntryValue">False</s:Boolean> | ||||||
|     <s:Boolean x:Key="/Default/CodeEditing/TypingAssist/SkipClosingBracesOnTabInStringLiterals/@EntryValue">True</s:Boolean> |  | ||||||
| 	<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=AssignmentInConditionalExpression/@EntryIndexedValue">DO_NOT_SHOW</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedAutoPropertyAccessor_002EGlobal/@EntryIndexedValue">DO_NOT_SHOW</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UnusedAutoPropertyAccessor_002ELocal/@EntryIndexedValue">DO_NOT_SHOW</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_ACCESSOR_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_ACCESSORHOLDER_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_RECORD_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue">ID</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IOS/@EntryIndexedValue">IOS</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IP/@EntryIndexedValue">IP</s:String> |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String> |  | ||||||
|     <s:String x:Key="/Default/CustomTools/CustomToolsData/@EntryValue"></s:String> |  | ||||||
|     <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">True</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> | ||||||
|     <s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">OFF</s:String> |     <s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">OFF</s:String> | ||||||
| @@ -30,6 +12,7 @@ | |||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="AA_BB" /></s:String> |     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="AA_BB" /></s:String> | ||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></s:String> |     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue"><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></s:String> | ||||||
|     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=StaticReadonly/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></s:String> |     <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=StaticReadonly/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /></s:String> | ||||||
|  |  | ||||||
|     <s:String x:Key="/Default/CodeStyle/CSharpFileLayoutPatterns/Pattern/@EntryValue"><?xml version="1.0" encoding="utf-16"?> |     <s:String x:Key="/Default/CodeStyle/CSharpFileLayoutPatterns/Pattern/@EntryValue"><?xml version="1.0" encoding="utf-16"?> | ||||||
| <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> | <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> | ||||||
|     <TypePattern> |     <TypePattern> | ||||||
| @@ -70,37 +53,5 @@ | |||||||
|         </Entry> |         </Entry> | ||||||
|     </TypePattern> |     </TypePattern> | ||||||
| </Patterns></s:String> | </Patterns></s:String> | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Aigc/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Biji/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Childs/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Depts/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=fenlei/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=FFFFFF/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Furion/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Haojia/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=hongbao/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=inte/@EntryIndexedValue">True</s:Boolean> |  | ||||||
| 	<s:Boolean x:Key="/Default/UserDictionary/Words/=Lant/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=logourl/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Meituan/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=miaosha/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=nicktitle/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=qudao/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Responsing/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Smzdm/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Tabao/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=tablename/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Taobao/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Taoke/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=Tese/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=timesort/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=weixin/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=XBOXONE/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=youhui/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=yugao/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=YYYYMMDD/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=YYYYMMDDHHMMSSFFFZZZZ/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=zhiyou/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|     <s:Boolean x:Key="/Default/UserDictionary/Words/=zhuanlan/@EntryIndexedValue">True</s:Boolean> |  | ||||||
|  |  | ||||||
| </wpf:ResourceDictionary> | </wpf:ResourceDictionary> | ||||||
							
								
								
									
										38
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								README.md
									
									
									
									
									
								
							| @@ -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 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,13 +6,14 @@ | |||||||
|         <Rule Id="SA0001" Action="Warning"/>          <!-- XML comment analysis disabled --> |         <Rule Id="SA0001" Action="Warning"/>          <!-- XML comment analysis disabled --> | ||||||
|         <Rule Id="SA0002" Action="Warning"/>          <!-- Invalid settings file --> |         <Rule Id="SA0002" Action="Warning"/>          <!-- Invalid settings file --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.SpacingRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.SpacingRules"> | ||||||
|         <Rule Id="SA1000" Action="Warning"/>          <!-- Keywords should be spaced correctly --> |         <Rule Id="SA1000" Action="Warning"/>          <!-- Keywords should be spaced correctly --> | ||||||
|         <Rule Id="SA1001" Action="None"/>             <!-- Commas should be spaced correctly --> |         <Rule Id="SA1001" Action="None"/>             <!-- Commas should be spaced correctly --> | ||||||
|         <Rule Id="SA1002" Action="Warning"/>          <!-- Semicolons should be spaced correctly --> |         <Rule Id="SA1002" Action="Warning"/>          <!-- Semicolons should be spaced correctly --> | ||||||
|         <Rule Id="SA1003" Action="Warning"/>          <!-- Symbols should be spaced correctly --> |         <Rule Id="SA1003" Action="Warning"/>          <!-- Symbols should be spaced correctly --> | ||||||
|         <Rule Id="SA1004" Action="Warning"/>          <!-- Documentation lines should begin with single space --> |         <Rule Id="SA1004" Action="Warning"/>          <!-- Documentation lines should begin with single space --> | ||||||
|         <Rule Id="SA1005" Action="Warning"/>             <!-- Single line comments should begin with single space --> |         <Rule Id="SA1005" Action="None"/>             <!-- Single line comments should begin with single space --> | ||||||
|         <Rule Id="SA1006" Action="Warning"/>          <!-- Preprocessor keywords should not be preceded by space --> |         <Rule Id="SA1006" Action="Warning"/>          <!-- Preprocessor keywords should not be preceded by space --> | ||||||
|         <Rule Id="SA1007" Action="Warning"/>          <!-- Operator keyword should be followed by space --> |         <Rule Id="SA1007" Action="Warning"/>          <!-- Operator keyword should be followed by space --> | ||||||
|         <Rule Id="SA1008" Action="None"/>             <!-- Opening parenthesis should be spaced correctly --> |         <Rule Id="SA1008" Action="None"/>             <!-- Opening parenthesis should be spaced correctly --> | ||||||
| @@ -30,41 +31,34 @@ | |||||||
|         <Rule Id="SA1020" Action="Warning"/>          <!-- Increment decrement symbols should be spaced correctly --> |         <Rule Id="SA1020" Action="Warning"/>          <!-- Increment decrement symbols should be spaced correctly --> | ||||||
|         <Rule Id="SA1021" Action="Warning"/>          <!-- Negative signs should be spaced correctly --> |         <Rule Id="SA1021" Action="Warning"/>          <!-- Negative signs should be spaced correctly --> | ||||||
|         <Rule Id="SA1022" Action="Warning"/>          <!-- Positive signs should be spaced correctly --> |         <Rule Id="SA1022" Action="Warning"/>          <!-- Positive signs should be spaced correctly --> | ||||||
|         <Rule Id="SA1023" |         <Rule Id="SA1023" Action="Warning"/>          <!-- Dereference and access of symbols should be spaced correctly --> | ||||||
|               Action="Warning"/>          <!-- Dereference and access of symbols should be spaced correctly --> |  | ||||||
|         <Rule Id="SA1024" Action="Warning"/>          <!-- Colons should be spaced correctly --> |         <Rule Id="SA1024" Action="Warning"/>          <!-- Colons should be spaced correctly --> | ||||||
|         <Rule Id="SA1025" Action="None"/>             <!-- Code should not contain multiple whitespace in a row --> |         <Rule Id="SA1025" Action="None"/>             <!-- Code should not contain multiple whitespace in a row --> | ||||||
|         <Rule Id="SA1026" |         <Rule Id="SA1026" Action="Warning"/>          <!-- Code should not contain space after new or stackalloc keyword in implicitly typed array allocation --> | ||||||
|               Action="Warning"/>          <!-- Code should not contain space after new or stackalloc keyword in implicitly typed array allocation --> |  | ||||||
|         <Rule Id="SA1027" Action="Warning"/>          <!-- Use tabs correctly --> |         <Rule Id="SA1027" Action="Warning"/>          <!-- Use tabs correctly --> | ||||||
|         <Rule Id="SA1028" Action="Warning"/>          <!-- Code should not contain trailing whitespace --> |         <Rule Id="SA1028" Action="Warning"/>          <!-- Code should not contain trailing whitespace --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.ReadabilityRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.ReadabilityRules"> | ||||||
|         <Rule Id="SA1100" |         <Rule Id="SA1100" Action="Warning"/>          <!-- Do not prefix calls with base unless local implementation exists --> | ||||||
|               Action="Warning"/>          <!-- Do not prefix calls with base unless local implementation exists --> |  | ||||||
|         <Rule Id="SA1101" Action="None"/>             <!-- Prefix local calls with this --> |         <Rule Id="SA1101" Action="None"/>             <!-- Prefix local calls with this --> | ||||||
|         <Rule Id="SA1102" Action="Warning"/>          <!-- Query clause should follow previous clause --> |         <Rule Id="SA1102" Action="Warning"/>          <!-- Query clause should follow previous clause --> | ||||||
|         <Rule Id="SA1103" |         <Rule Id="SA1103" Action="Warning"/>          <!-- Query clauses should be on separate lines or all on one line --> | ||||||
|               Action="Warning"/>          <!-- Query clauses should be on separate lines or all on one line --> |         <Rule Id="SA1104" Action="Warning"/>          <!-- Query clause should begin on new line when previous clause spans multiple lines --> | ||||||
|         <Rule Id="SA1104" |         <Rule Id="SA1105" Action="Warning"/>          <!-- Query clauses spanning multiple lines should begin on own line --> | ||||||
|               Action="Warning"/>          <!-- Query clause should begin on new line when previous clause spans multiple lines --> |  | ||||||
|         <Rule Id="SA1105" |  | ||||||
|               Action="Warning"/>          <!-- Query clauses spanning multiple lines should begin on own line --> |  | ||||||
|         <Rule Id="SA1106" Action="Warning"/>          <!-- Code should not contain empty statements --> |         <Rule Id="SA1106" Action="Warning"/>          <!-- Code should not contain empty statements --> | ||||||
|         <Rule Id="SA1107" Action="Warning"/>          <!-- Code should not contain multiple statements on one line --> |         <Rule Id="SA1107" Action="Warning"/>          <!-- Code should not contain multiple statements on one line --> | ||||||
|         <Rule Id="SA1108" Action="Warning"/>          <!-- Block statements should not contain embedded comments --> |         <Rule Id="SA1108" Action="Warning"/>          <!-- Block statements should not contain embedded comments --> | ||||||
|         <Rule Id="SA1109" Action="Warning"/>          <!-- Block statements should not contain embedded regions --> |         <Rule Id="SA1109" Action="Warning"/>          <!-- Block statements should not contain embedded regions --> | ||||||
|         <Rule Id="SA1110" |         <Rule Id="SA1110" Action="Warning"/>          <!-- Opening parenthesis or bracket should be on declaration line --> | ||||||
|               Action="Warning"/>          <!-- Opening parenthesis or bracket should be on declaration line --> |  | ||||||
|         <Rule Id="SA1111" Action="Warning"/>          <!-- Closing parenthesis should be on line of last parameter --> |         <Rule Id="SA1111" Action="Warning"/>          <!-- Closing parenthesis should be on line of last parameter --> | ||||||
|         <Rule Id="SA1112" |         <Rule Id="SA1112" Action="Warning"/>          <!-- Closing parenthesis should be on line of opening parenthesis --> | ||||||
|               Action="Warning"/>          <!-- Closing parenthesis should be on line of opening parenthesis --> |  | ||||||
|         <Rule Id="SA1113" Action="None"/>             <!-- Comma should be on the same line as previous parameter --> |         <Rule Id="SA1113" Action="None"/>             <!-- Comma should be on the same line as previous parameter --> | ||||||
|         <Rule Id="SA1114" Action="Warning"/>          <!-- Parameter list should follow declaration --> |         <Rule Id="SA1114" Action="Warning"/>          <!-- Parameter list should follow declaration --> | ||||||
|         <Rule Id="SA1115" Action="Warning"/>          <!-- Parameter should follow comma --> |         <Rule Id="SA1115" Action="Warning"/>          <!-- Parameter should follow comma --> | ||||||
|         <Rule Id="SA1116" Action="Warning"/>          <!-- Split parameters should start on line after declaration --> |         <Rule Id="SA1116" Action="Warning"/>          <!-- Split parameters should start on line after declaration --> | ||||||
|         <Rule Id="SA1117" Action="None"/>             <!-- Parameters should be on same line or separate lines --> |         <Rule Id="SA1117" Action="None"/>             <!-- Parameters should be on same line or separate lines --> | ||||||
|         <Rule Id="SA1118" Action="None"/>          <!-- Parameter should not span multiple lines --> |         <Rule Id="SA1118" Action="Warning"/>          <!-- Parameter should not span multiple lines --> | ||||||
|         <Rule Id="SA1120" Action="None"/>             <!-- Comments should contain text --> |         <Rule Id="SA1120" Action="None"/>             <!-- Comments should contain text --> | ||||||
|         <Rule Id="SA1121" Action="Warning"/>          <!-- Use built-in type alias --> |         <Rule Id="SA1121" Action="Warning"/>          <!-- Use built-in type alias --> | ||||||
|         <Rule Id="SA1122" Action="Warning"/>          <!-- Use string.Empty for empty strings --> |         <Rule Id="SA1122" Action="Warning"/>          <!-- Use string.Empty for empty strings --> | ||||||
| @@ -79,13 +73,14 @@ | |||||||
|         <Rule Id="SA1131" Action="Warning"/>          <!-- Use readable conditions --> |         <Rule Id="SA1131" Action="Warning"/>          <!-- Use readable conditions --> | ||||||
|         <Rule Id="SA1132" Action="Warning"/>          <!-- Do not combine fields --> |         <Rule Id="SA1132" Action="Warning"/>          <!-- Do not combine fields --> | ||||||
|         <Rule Id="SA1133" Action="Warning"/>          <!-- Do not combine attributes --> |         <Rule Id="SA1133" Action="Warning"/>          <!-- Do not combine attributes --> | ||||||
|         <Rule Id="SA1134" Action="Warning"/>             <!-- Attributes should not share line --> |         <Rule Id="SA1134" Action="None"/>             <!-- Attributes should not share line --> | ||||||
|         <Rule Id="SA1135" Action="Warning"/>          <!-- Using directives should be qualified --> |         <Rule Id="SA1135" Action="Warning"/>          <!-- Using directives should be qualified --> | ||||||
|         <Rule Id="SA1136" Action="Warning"/>          <!-- Enum values should be on separate lines --> |         <Rule Id="SA1136" Action="Warning"/>          <!-- Enum values should be on separate lines --> | ||||||
|         <Rule Id="SA1137" Action="Warning"/>          <!-- Elements should have the same indentation --> |         <Rule Id="SA1137" Action="Warning"/>          <!-- Elements should have the same indentation --> | ||||||
|         <Rule Id="SA1139" Action="Warning"/>          <!-- Use literal suffix notation instead of casting --> |         <Rule Id="SA1139" Action="Warning"/>          <!-- Use literal suffix notation instead of casting --> | ||||||
|         <Rule Id="SX1101" Action="Warning"/>          <!-- Do not prefix local calls with 'this.' --> |         <Rule Id="SX1101" Action="Warning"/>          <!-- Do not prefix local calls with 'this.' --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.OrderingRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.OrderingRules"> | ||||||
|         <Rule Id="SA1200" Action="None"/>             <!-- Using directives should be placed correctly --> |         <Rule Id="SA1200" Action="None"/>             <!-- Using directives should be placed correctly --> | ||||||
|         <Rule Id="SA1201" Action="Warning"/>          <!-- Elements should appear in the correct order --> |         <Rule Id="SA1201" Action="Warning"/>          <!-- Elements should appear in the correct order --> | ||||||
| @@ -95,87 +90,79 @@ | |||||||
|         <Rule Id="SA1205" Action="Warning"/>          <!-- Partial elements should declare access --> |         <Rule Id="SA1205" Action="Warning"/>          <!-- Partial elements should declare access --> | ||||||
|         <Rule Id="SA1206" Action="Warning"/>          <!-- Declaration keywords should follow order --> |         <Rule Id="SA1206" Action="Warning"/>          <!-- Declaration keywords should follow order --> | ||||||
|         <Rule Id="SA1207" Action="Warning"/>          <!-- Protected should come before internal --> |         <Rule Id="SA1207" Action="Warning"/>          <!-- Protected should come before internal --> | ||||||
|         <Rule Id="SA1208" |         <Rule Id="SA1208" Action="Warning"/>          <!-- System using directives should be placed before other using directives --> | ||||||
|               Action="Warning"/>          <!-- System using directives should be placed before other using directives --> |         <Rule Id="SA1209" Action="Warning"/>          <!-- Using alias directives should be placed after other using directives --> | ||||||
|         <Rule Id="SA1209" |         <Rule Id="SA1210" Action="Warning"/>          <!-- Using directives should be ordered alphabetically by namespace --> | ||||||
|               Action="Warning"/>          <!-- Using alias directives should be placed after other using directives --> |         <Rule Id="SA1211" Action="Warning"/>          <!-- Using alias directives should be ordered alphabetically by alias name --> | ||||||
|         <Rule Id="SA1210" |  | ||||||
|               Action="Warning"/>          <!-- Using directives should be ordered alphabetically by namespace --> |  | ||||||
|         <Rule Id="SA1211" |  | ||||||
|               Action="Warning"/>          <!-- Using alias directives should be ordered alphabetically by alias name --> |  | ||||||
|         <Rule Id="SA1212" Action="Warning"/>          <!-- Property accessors should follow order --> |         <Rule Id="SA1212" Action="Warning"/>          <!-- Property accessors should follow order --> | ||||||
|         <Rule Id="SA1213" Action="Warning"/>          <!-- Event accessors should follow order --> |         <Rule Id="SA1213" Action="Warning"/>          <!-- Event accessors should follow order --> | ||||||
|         <Rule Id="SA1214" Action="Warning"/>          <!-- Readonly fields should appear before non-readonly fields --> |         <Rule Id="SA1214" Action="Warning"/>          <!-- Readonly fields should appear before non-readonly fields --> | ||||||
|         <Rule Id="SA1216" |         <Rule Id="SA1216" Action="Warning"/>          <!-- Using static directives should be placed at the correct location --> | ||||||
|               Action="Warning"/>          <!-- Using static directives should be placed at the correct location --> |  | ||||||
|         <Rule Id="SA1217" Action="Warning"/>          <!-- Using static directives should be ordered alphabetically --> |         <Rule Id="SA1217" Action="Warning"/>          <!-- Using static directives should be ordered alphabetically --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.NamingRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.NamingRules"> | ||||||
|         <Rule Id="SA1300" Action="Warning"/>          <!-- Element should begin with upper-case letter --> |         <Rule Id="SA1300" Action="Warning"/>          <!-- Element should begin with upper-case letter --> | ||||||
|         <Rule Id="SA1301" Action="Warning"/>          <!-- Element should begin with lower-case letter --> |         <Rule Id="SA1301" Action="Warning"/>          <!-- Element should begin with lower-case letter --> | ||||||
|         <Rule Id="SA1302" Action="Warning"/>          <!-- Interface names should begin with I --> |         <Rule Id="SA1302" Action="Warning"/>          <!-- Interface names should begin with I --> | ||||||
|         <Rule Id="SA1303" Action="Warning"/>          <!-- Const field names should begin with upper-case letter --> |         <Rule Id="SA1303" Action="Warning"/>          <!-- Const field names should begin with upper-case letter --> | ||||||
|         <Rule Id="SA1304" |         <Rule Id="SA1304" Action="Warning"/>          <!-- Non-private readonly fields should begin with upper-case letter --> | ||||||
|               Action="Warning"/>          <!-- Non-private readonly fields should begin with upper-case letter --> |  | ||||||
|         <Rule Id="SA1305" Action="None"/>             <!-- Field names should not use Hungarian notation --> |         <Rule Id="SA1305" Action="None"/>             <!-- Field names should not use Hungarian notation --> | ||||||
|         <Rule Id="SA1306" Action="Warning"/>          <!-- Field names should begin with lower-case letter --> |         <Rule Id="SA1306" Action="Warning"/>          <!-- Field names should begin with lower-case letter --> | ||||||
|         <Rule Id="SA1307" Action="Warning"/>          <!-- Accessible fields should begin with upper-case letter --> |         <Rule Id="SA1307" Action="Warning"/>          <!-- Accessible fields should begin with upper-case letter --> | ||||||
|         <Rule Id="SA1308" Action="Warning"/>          <!-- Variable names should not be prefixed --> |         <Rule Id="SA1308" Action="Warning"/>          <!-- Variable names should not be prefixed --> | ||||||
|         <Rule Id="SA1309" Action="None"/>             <!-- Field names should not begin with underscore --> |         <Rule Id="SA1309" Action="None"/>             <!-- Field names should not begin with underscore --> | ||||||
|         <Rule Id="SA1310" Action="None"/>             <!-- Field names should not contain underscore --> |         <Rule Id="SA1310" Action="None"/>             <!-- Field names should not contain underscore --> | ||||||
|         <Rule Id="SA1311" |         <Rule Id="SA1311" Action="Warning"/>          <!-- Static readonly fields should begin with upper-case letter --> | ||||||
|               Action="Warning"/>          <!-- Static readonly fields should begin with upper-case letter --> |  | ||||||
|         <Rule Id="SA1312" Action="Warning"/>          <!-- Variable names should begin with lower-case letter --> |         <Rule Id="SA1312" Action="Warning"/>          <!-- Variable names should begin with lower-case letter --> | ||||||
|         <Rule Id="SA1313" Action="None"/>             <!-- Parameter names should begin with lower-case letter --> |         <Rule Id="SA1313" Action="None"/>             <!-- Parameter names should begin with lower-case letter --> | ||||||
|         <Rule Id="SA1314" Action="Warning"/>          <!-- Type parameter names should begin with T --> |         <Rule Id="SA1314" Action="Warning"/>          <!-- Type parameter names should begin with T --> | ||||||
|         <Rule Id="SX1309" Action="Warning"/>          <!-- Field names should begin with underscore --> |         <Rule Id="SX1309" Action="Warning"/>          <!-- Field names should begin with underscore --> | ||||||
|         <Rule Id="SX1309S" Action="Warning"/>         <!-- Static field names should begin with underscore --> |         <Rule Id="SX1309S" Action="Warning"/>         <!-- Static field names should begin with underscore --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.MaintainabilityRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.MaintainabilityRules"> | ||||||
|         <Rule Id="SA1119" Action="Warning"/>          <!-- Statement should not use unnecessary parenthesis --> |         <Rule Id="SA1119" Action="Warning"/>          <!-- Statement should not use unnecessary parenthesis --> | ||||||
|         <Rule Id="SA1400" Action="Warning"/>          <!-- Access modifier should be declared --> |         <Rule Id="SA1400" Action="Warning"/>          <!-- Access modifier should be declared --> | ||||||
|         <Rule Id="SA1401" Action="Warning"/>          <!-- Fields should be private --> |         <Rule Id="SA1401" Action="Warning"/>          <!-- Fields should be private --> | ||||||
|         <Rule Id="SA1402" Action="None"/>          <!-- File may only contain a single type --> |         <Rule Id="SA1402" Action="Warning"/>          <!-- File may only contain a single type --> | ||||||
|         <Rule Id="SA1403" Action="Warning"/>          <!-- File may only contain a single namespace --> |         <Rule Id="SA1403" Action="Warning"/>          <!-- File may only contain a single namespace --> | ||||||
|         <Rule Id="SA1404" Action="Warning"/>          <!-- Code analysis suppression should have justification --> |         <Rule Id="SA1404" Action="Warning"/>          <!-- Code analysis suppression should have justification --> | ||||||
|         <Rule Id="SA1405" Action="Warning"/>          <!-- Debug.Assert should provide message text --> |         <Rule Id="SA1405" Action="Warning"/>          <!-- Debug.Assert should provide message text --> | ||||||
|         <Rule Id="SA1406" Action="Warning"/>          <!-- Debug.Fail should provide message text --> |         <Rule Id="SA1406" Action="Warning"/>          <!-- Debug.Fail should provide message text --> | ||||||
|         <Rule Id="SA1407" Action="Warning"/>             <!-- Arithmetic expressions should declare precedence --> |         <Rule Id="SA1407" Action="None"/>             <!-- Arithmetic expressions should declare precedence --> | ||||||
|         <Rule Id="SA1408" Action="Warning"/>          <!-- Conditional expressions should declare precedence --> |         <Rule Id="SA1408" Action="Warning"/>          <!-- Conditional expressions should declare precedence --> | ||||||
|         <Rule Id="SA1409" Action="Warning"/>          <!-- Remove unnecessary code --> |         <Rule Id="SA1409" Action="Warning"/>          <!-- Remove unnecessary code --> | ||||||
|         <Rule Id="SA1410" Action="Warning"/>          <!-- Remove delegate parenthesis when possible --> |         <Rule Id="SA1410" Action="Warning"/>          <!-- Remove delegate parenthesis when possible --> | ||||||
|         <Rule Id="SA1411" |         <Rule Id="SA1411" Action="Warning"/>          <!-- Attribute constructor should not use unnecessary parenthesis --> | ||||||
|               Action="Warning"/>          <!-- Attribute constructor should not use unnecessary parenthesis --> |  | ||||||
|         <Rule Id="SA1412" Action="None"/>             <!-- Store files as UTF-8 with byte order mark --> |         <Rule Id="SA1412" Action="None"/>             <!-- Store files as UTF-8 with byte order mark --> | ||||||
|         <Rule Id="SA1413" Action="None"/>             <!-- Use trailing comma in multi-line initializers --> |         <Rule Id="SA1413" Action="None"/>             <!-- Use trailing comma in multi-line initializers --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.LayoutRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.LayoutRules"> | ||||||
|         <Rule Id="SA1500" Action="None"/>             <!-- Braces for multi-line statements should not share line --> |         <Rule Id="SA1500" Action="None"/>             <!-- Braces for multi-line statements should not share line --> | ||||||
|         <Rule Id="SA1501" Action="Warning"/>          <!-- Statement should not be on a single line --> |         <Rule Id="SA1501" Action="Warning"/>          <!-- Statement should not be on a single line --> | ||||||
|         <Rule Id="SA1502" Action="None"/>             <!-- Element should not be on a single line --> |         <Rule Id="SA1502" Action="None"/>             <!-- Element should not be on a single line --> | ||||||
|         <Rule Id="SA1503" Action="Warning"/>             <!-- Braces should not be omitted --> |         <Rule Id="SA1503" Action="None"/>             <!-- Braces should not be omitted --> | ||||||
|         <Rule Id="SA1504" Action="Warning"/>          <!-- All accessors should be single-line or multi-line --> |         <Rule Id="SA1504" Action="Warning"/>          <!-- All accessors should be single-line or multi-line --> | ||||||
|         <Rule Id="SA1505" Action="Warning"/>          <!-- Opening braces should not be followed by blank line --> |         <Rule Id="SA1505" Action="Warning"/>          <!-- Opening braces should not be followed by blank line --> | ||||||
|         <Rule Id="SA1506" |         <Rule Id="SA1506" Action="Warning"/>          <!-- Element documentation headers should not be followed by blank line --> | ||||||
|               Action="Warning"/>          <!-- Element documentation headers should not be followed by blank line --> |  | ||||||
|         <Rule Id="SA1507" Action="Warning"/>          <!-- Code should not contain multiple blank lines in a row --> |         <Rule Id="SA1507" Action="Warning"/>          <!-- Code should not contain multiple blank lines in a row --> | ||||||
|         <Rule Id="SA1508" Action="Warning"/>          <!-- Closing braces should not be preceded by blank line --> |         <Rule Id="SA1508" Action="Warning"/>          <!-- Closing braces should not be preceded by blank line --> | ||||||
|         <Rule Id="SA1509" Action="Warning"/>          <!-- Opening braces should not be preceded by blank line --> |         <Rule Id="SA1509" Action="Warning"/>          <!-- Opening braces should not be preceded by blank line --> | ||||||
|         <Rule Id="SA1510" |         <Rule Id="SA1510" Action="Warning"/>          <!-- Chained statement blocks should not be preceded by blank line --> | ||||||
|               Action="Warning"/>          <!-- Chained statement blocks should not be preceded by blank line --> |  | ||||||
|         <Rule Id="SA1511" Action="Warning"/>          <!-- While-do footer should not be preceded by blank line --> |         <Rule Id="SA1511" Action="Warning"/>          <!-- While-do footer should not be preceded by blank line --> | ||||||
|         <Rule Id="SA1512" Action="Warning"/>          <!-- Single-line comments should not be followed by blank line --> |         <Rule Id="SA1512" Action="Warning"/>          <!-- Single-line comments should not be followed by blank line --> | ||||||
|         <Rule Id="SA1513" Action="Warning"/>          <!-- Closing brace should be followed by blank line --> |         <Rule Id="SA1513" Action="Warning"/>          <!-- Closing brace should be followed by blank line --> | ||||||
|         <Rule Id="SA1514" |         <Rule Id="SA1514" Action="Warning"/>          <!-- Element documentation header should be preceded by blank line --> | ||||||
|               Action="Warning"/>          <!-- Element documentation header should be preceded by blank line --> |  | ||||||
|         <Rule Id="SA1515" Action="Warning"/>          <!-- Single-line comment should be preceded by blank line --> |         <Rule Id="SA1515" Action="Warning"/>          <!-- Single-line comment should be preceded by blank line --> | ||||||
|         <Rule Id="SA1516" Action="Warning"/>          <!-- Elements should be separated by blank line --> |         <Rule Id="SA1516" Action="Warning"/>          <!-- Elements should be separated by blank line --> | ||||||
|         <Rule Id="SA1517" Action="Warning"/>          <!-- Code should not contain blank lines at start of file --> |         <Rule Id="SA1517" Action="Warning"/>          <!-- Code should not contain blank lines at start of file --> | ||||||
|         <Rule Id="SA1518" Action="Warning"/>          <!-- Use line endings correctly at end of file --> |         <Rule Id="SA1518" Action="Warning"/>          <!-- Use line endings correctly at end of file --> | ||||||
|         <Rule Id="SA1519" |         <Rule Id="SA1519" Action="Warning"/>          <!-- Braces should not be omitted from multi-line child statement --> | ||||||
|               Action="Warning"/>          <!-- Braces should not be omitted from multi-line child statement --> |  | ||||||
|         <Rule Id="SA1520" Action="Warning"/>          <!-- Use braces consistently --> |         <Rule Id="SA1520" Action="Warning"/>          <!-- Use braces consistently --> | ||||||
|     </Rules> |     </Rules> | ||||||
|  | 
 | ||||||
|     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.DocumentationRules"> |     <Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers.DocumentationRules"> | ||||||
|         <Rule Id="SA1600" Action="None"/>             <!-- Elements should be documented --> |         <Rule Id="SA1600" Action="None"/>             <!-- Elements should be documented --> | ||||||
|         <Rule Id="SA1601" Action="None"/>             <!-- Partial elements should be documented --> |         <Rule Id="SA1601" Action="None"/>             <!-- Partial elements should be documented --> | ||||||
| @@ -186,34 +173,27 @@ | |||||||
|         <Rule Id="SA1606" Action="Warning"/>          <!-- Element documentation should have summary text --> |         <Rule Id="SA1606" Action="Warning"/>          <!-- Element documentation should have summary text --> | ||||||
|         <Rule Id="SA1607" Action="Warning"/>          <!-- Partial element documentation should have summary text --> |         <Rule Id="SA1607" Action="Warning"/>          <!-- Partial element documentation should have summary text --> | ||||||
|         <Rule Id="SA1608" Action="Warning"/>          <!-- Element documentation should not have default summary --> |         <Rule Id="SA1608" Action="Warning"/>          <!-- Element documentation should not have default summary --> | ||||||
|         <Rule Id="SA1609" Action="None"/>          <!-- Property documentation should have value --> |         <Rule Id="SA1609" Action="Warning"/>          <!-- Property documentation should have value --> | ||||||
|         <Rule Id="SA1610" Action="Warning"/>          <!-- Property documentation should have value text --> |         <Rule Id="SA1610" Action="Warning"/>          <!-- Property documentation should have value text --> | ||||||
|         <Rule Id="SA1611" Action="None"/>             <!-- Element parameters should be documented --> |         <Rule Id="SA1611" Action="None"/>             <!-- Element parameters should be documented --> | ||||||
|         <Rule Id="SA1612" |         <Rule Id="SA1612" Action="Warning"/>          <!-- Element parameter documentation should match element parameters --> | ||||||
|               Action="Warning"/>          <!-- Element parameter documentation should match element parameters --> |         <Rule Id="SA1613" Action="Warning"/>          <!-- Element parameter documentation should declare parameter name --> | ||||||
|         <Rule Id="SA1613" |  | ||||||
|               Action="Warning"/>          <!-- Element parameter documentation should declare parameter name --> |  | ||||||
|         <Rule Id="SA1614" Action="Warning"/>          <!-- Element parameter documentation should have text --> |         <Rule Id="SA1614" Action="Warning"/>          <!-- Element parameter documentation should have text --> | ||||||
|         <Rule Id="SA1615" Action="None"/>             <!-- Element return value should be documented --> |         <Rule Id="SA1615" Action="None"/>             <!-- Element return value should be documented --> | ||||||
|         <Rule Id="SA1616" Action="Warning"/>          <!-- Element return value documentation should have text --> |         <Rule Id="SA1616" Action="Warning"/>          <!-- Element return value documentation should have text --> | ||||||
|         <Rule Id="SA1617" Action="Warning"/>          <!-- Void return value should not be documented --> |         <Rule Id="SA1617" Action="Warning"/>          <!-- Void return value should not be documented --> | ||||||
|         <Rule Id="SA1618" Action="None"/>             <!-- Generic type parameters should be documented --> |         <Rule Id="SA1618" Action="None"/>             <!-- Generic type parameters should be documented --> | ||||||
|         <Rule Id="SA1619" |         <Rule Id="SA1619" Action="None"/>             <!-- Generic type parameters should be documented partial class --> | ||||||
|               Action="None"/>             <!-- Generic type parameters should be documented partial class --> |         <Rule Id="SA1620" Action="Warning"/>          <!-- Generic type parameter documentation should match type parameters --> | ||||||
|         <Rule Id="SA1620" |         <Rule Id="SA1621" Action="Warning"/>          <!-- Generic type parameter documentation should declare parameter name --> | ||||||
|               Action="Warning"/>          <!-- Generic type parameter documentation should match type parameters --> |  | ||||||
|         <Rule Id="SA1621" |  | ||||||
|               Action="Warning"/>          <!-- Generic type parameter documentation should declare parameter name --> |  | ||||||
|         <Rule Id="SA1622" Action="Warning"/>          <!-- Generic type parameter documentation should have text --> |         <Rule Id="SA1622" Action="Warning"/>          <!-- Generic type parameter documentation should have text --> | ||||||
|         <Rule Id="SA1623" Action="None"/>          <!-- Property summary documentation should match accessors --> |         <Rule Id="SA1623" Action="Warning"/>          <!-- Property summary documentation should match accessors --> | ||||||
|         <Rule Id="SA1624" |         <Rule Id="SA1624" Action="Warning"/>          <!-- Property summary documentation should omit accessor with restricted access --> | ||||||
|               Action="Warning"/>          <!-- Property summary documentation should omit accessor with restricted access --> |  | ||||||
|         <Rule Id="SA1625" Action="Warning"/>          <!-- Element documentation should not be copied and pasted --> |         <Rule Id="SA1625" Action="Warning"/>          <!-- Element documentation should not be copied and pasted --> | ||||||
|         <Rule Id="SA1626" |         <Rule Id="SA1626" Action="Warning"/>          <!-- Single-line comments should not use documentation style slashes --> | ||||||
|               Action="Warning"/>          <!-- Single-line comments should not use documentation style slashes --> |  | ||||||
|         <Rule Id="SA1627" Action="Warning"/>          <!-- Documentation text should not be empty --> |         <Rule Id="SA1627" Action="Warning"/>          <!-- Documentation text should not be empty --> | ||||||
|         <Rule Id="SA1628" Action="Warning"/>          <!-- Documentation text should begin with a capital letter --> |         <Rule Id="SA1628" Action="Warning"/>          <!-- Documentation text should begin with a capital letter --> | ||||||
|         <Rule Id="SA1629" Action="None"/>          <!-- Documentation text should end with a period --> |         <Rule Id="SA1629" Action="None"/>             <!-- Documentation text should end with a period --> | ||||||
|         <Rule Id="SA1630" Action="Warning"/>          <!-- Documentation text should contain whitespace --> |         <Rule Id="SA1630" Action="Warning"/>          <!-- Documentation text should contain whitespace --> | ||||||
|         <Rule Id="SA1631" Action="Warning"/>          <!-- Documentation should meet character percentage --> |         <Rule Id="SA1631" Action="Warning"/>          <!-- Documentation should meet character percentage --> | ||||||
|         <Rule Id="SA1632" Action="Warning"/>          <!-- Documentation text should meet minimum character length --> |         <Rule Id="SA1632" Action="Warning"/>          <!-- Documentation text should meet minimum character length --> | ||||||
| @@ -222,15 +202,12 @@ | |||||||
|         <Rule Id="SA1635" Action="Warning"/>          <!-- File header should have copyright text --> |         <Rule Id="SA1635" Action="Warning"/>          <!-- File header should have copyright text --> | ||||||
|         <Rule Id="SA1636" Action="Warning"/>          <!-- File header copyright text should match --> |         <Rule Id="SA1636" Action="Warning"/>          <!-- File header copyright text should match --> | ||||||
|         <Rule Id="SA1637" Action="Warning"/>          <!-- File header should contain file name --> |         <Rule Id="SA1637" Action="Warning"/>          <!-- File header should contain file name --> | ||||||
|         <Rule Id="SA1638" |         <Rule Id="SA1638" Action="Warning"/>          <!-- File header file name documentation should match file name --> | ||||||
|               Action="Warning"/>          <!-- File header file name documentation should match file name --> |  | ||||||
|         <Rule Id="SA1639" Action="Warning"/>          <!-- File header should have summary --> |         <Rule Id="SA1639" Action="Warning"/>          <!-- File header should have summary --> | ||||||
|         <Rule Id="SA1640" Action="Warning"/>          <!-- File header should have valid company text --> |         <Rule Id="SA1640" Action="Warning"/>          <!-- File header should have valid company text --> | ||||||
|         <Rule Id="SA1641" Action="Warning"/>          <!-- File header company name text should match --> |         <Rule Id="SA1641" Action="Warning"/>          <!-- File header company name text should match --> | ||||||
|         <Rule Id="SA1642" |         <Rule Id="SA1642" Action="Warning"/>          <!-- Constructor summary documentation should begin with standard text --> | ||||||
|               Action="Warning"/>          <!-- Constructor summary documentation should begin with standard text --> |         <Rule Id="SA1643" Action="Warning"/>          <!-- Destructor summary documentation should begin with standard text --> | ||||||
|         <Rule Id="SA1643" |  | ||||||
|               Action="Warning"/>          <!-- Destructor summary documentation should begin with standard text --> |  | ||||||
|         <Rule Id="SA1644" Action="Warning"/>          <!-- Documentation headers should not contain blank lines --> |         <Rule Id="SA1644" Action="Warning"/>          <!-- Documentation headers should not contain blank lines --> | ||||||
|         <Rule Id="SA1645" Action="Warning"/>          <!-- Included documentation file does not exist --> |         <Rule Id="SA1645" Action="Warning"/>          <!-- Included documentation file does not exist --> | ||||||
|         <Rule Id="SA1646" Action="Warning"/>          <!-- Included documentation XPath does not exist --> |         <Rule Id="SA1646" Action="Warning"/>          <!-- Included documentation XPath does not exist --> | ||||||
| @@ -239,5 +216,6 @@ | |||||||
|         <Rule Id="SA1649" Action="Warning"/>          <!-- File name should match first type name --> |         <Rule Id="SA1649" Action="Warning"/>          <!-- File name should match first type name --> | ||||||
|         <Rule Id="SA1650" Action="Warning"/>          <!-- Element documentation should be spelled correctly --> |         <Rule Id="SA1650" Action="Warning"/>          <!-- Element documentation should be spelled correctly --> | ||||||
|         <Rule Id="SA1651" Action="Warning"/>          <!-- Do not use placeholder elements --> |         <Rule Id="SA1651" Action="Warning"/>          <!-- Do not use placeholder elements --> | ||||||
|  | 
 | ||||||
|     </Rules> |     </Rules> | ||||||
| </RuleSet> | </RuleSet> | ||||||
							
								
								
									
										169
									
								
								build.cake
									
									
									
									
									
								
							
							
						
						
									
										169
									
								
								build.cake
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| var target = Argument("target", "Default"); | var target = Argument("target", "Default"); | ||||||
| var configuration = Argument("configuration", "Release"); | var configuration = Argument("configuration", "Release"); | ||||||
| var framework = Argument("framework", "net7.0"); | var pkgOutPath = $"./dist/NSExt/pkg/{configuration}"; | ||||||
|  |  | ||||||
| //////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////// | ||||||
| // Tasks | // Tasks | ||||||
| @@ -8,108 +8,123 @@ var framework = Argument("framework", "net7.0"); | |||||||
| Task("Clean") | Task("Clean") | ||||||
|     .Does(context => |     .Does(context => | ||||||
| { | { | ||||||
|     context.CleanDirectory("./dist"); |     context.CleanDirectory(pkgOutPath); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| Task("Build") | Task("Build") | ||||||
|     .IsDependentOn("Clean") |     .IsDependentOn("Clean") | ||||||
|     .Does(context => |     .Does(context => | ||||||
| { | { | ||||||
|     DotNetPublish("./src/NSExt/NSExt.csproj", new DotNetPublishSettings { |     DotNetBuild("./NSExt.sln", new DotNetBuildSettings { | ||||||
|         Configuration = configuration, |         Configuration = configuration, | ||||||
|         Framework = framework, |         NoIncremental = context.HasArgument("rebuild"), | ||||||
|  |         MSBuildSettings = new DotNetMSBuildSettings() | ||||||
|  |             .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) | ||||||
|     }); |     }); | ||||||
| }); | }); | ||||||
|  |  | ||||||
|  |  | ||||||
| // Task("Test") | Task("Test") | ||||||
| //     .IsDependentOn("Build") |     .IsDependentOn("Build") | ||||||
| //     .Does(context => |     .Does(context => | ||||||
| // { | { | ||||||
| //     DotNetTest("./test/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings { |     DotNetTest("./test/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings { | ||||||
| //         Configuration = configuration, |         Configuration = configuration, | ||||||
| //         NoRestore = true, |         NoRestore = true, | ||||||
| //         NoBuild = true, |         NoBuild = true, | ||||||
| //     }); |     }); | ||||||
| // |  | ||||||
| //     DotNetTest("./test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings { |  | ||||||
| //         Configuration = configuration, |  | ||||||
| //         NoRestore = true, |  | ||||||
| //         NoBuild = true, |  | ||||||
| //     }); |  | ||||||
| // |  | ||||||
| //     DotNetTest("./test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj", new DotNetTestSettings { |  | ||||||
| //         Configuration = configuration, |  | ||||||
| //         NoRestore = true, |  | ||||||
| //         NoBuild = true, |  | ||||||
| //     }); |  | ||||||
| // }); |  | ||||||
|  |  | ||||||
|  |     DotNetTest("./test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings { | ||||||
|  |         Configuration = configuration, | ||||||
|  |         NoRestore = true, | ||||||
|  |         NoBuild = true, | ||||||
|  |     }); | ||||||
|  |  | ||||||
| // Task("Publish-GitHub") |     DotNetTest("./test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj", new DotNetTestSettings { | ||||||
| //     .WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") |         Configuration = configuration, | ||||||
| //     //.IsDependentOn("Package") |         NoRestore = true, | ||||||
| //     .Does(context => |         NoBuild = true, | ||||||
| // { |     }); | ||||||
| //     var apiKey = Argument<string>("github-key", null); | }); | ||||||
| //     if(string.IsNullOrWhiteSpace(apiKey)) { |  | ||||||
| //         throw new CakeException("No GitHub API key was provided."); | Task("Package") | ||||||
| //     } |     .IsDependentOn("Build") | ||||||
| // |     .Does(context => | ||||||
| //     // Publish to GitHub Packages | { | ||||||
| //     var exitCode = 0; |     context.DotNetPack("./NSExt.sln", new DotNetPackSettings { | ||||||
| //     foreach(var file in context.GetFiles("./.artifacts/*.nupkg")) |         Configuration = configuration, | ||||||
| //     { |         NoRestore = true, | ||||||
| //         context.Information("Publishing {0}...", file.GetFilename().FullPath); |         NoBuild = true, | ||||||
| //         exitCode += StartProcess("dotnet", |         OutputDirectory = pkgOutPath, | ||||||
| //             new ProcessSettings { |         MSBuildSettings = new DotNetMSBuildSettings() | ||||||
| //                 Arguments = new ProcessArgumentBuilder() |             .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) | ||||||
| //                     .Append("gpr") |     }); | ||||||
| //                     .Append("push") | }); | ||||||
| //                     .AppendQuoted(file.FullPath) |  | ||||||
| //                     .AppendSwitchSecret("-k", " ", apiKey) | Task("Publish-GitHub") | ||||||
| //             } |     .WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") | ||||||
| //         ); |     .IsDependentOn("Package") | ||||||
| //     } |     .Does(context => | ||||||
| // | { | ||||||
| //     if(exitCode != 0) |     var apiKey = Argument<string>("github-key", null); | ||||||
| //     { |     if(string.IsNullOrWhiteSpace(apiKey)) { | ||||||
| //         throw new CakeException("Could not push GitHub packages."); |         throw new CakeException("No GitHub API key was provided."); | ||||||
| //     } |     } | ||||||
| // }); |  | ||||||
|  |     // Publish to GitHub Packages | ||||||
|  |     var exitCode = 0; | ||||||
|  |     foreach(var file in context.GetFiles("./.artifacts/*.nupkg")) | ||||||
|  |     { | ||||||
|  |         context.Information("Publishing {0}...", file.GetFilename().FullPath); | ||||||
|  |         exitCode += StartProcess("dotnet", | ||||||
|  |             new ProcessSettings { | ||||||
|  |                 Arguments = new ProcessArgumentBuilder() | ||||||
|  |                     .Append("gpr") | ||||||
|  |                     .Append("push") | ||||||
|  |                     .AppendQuoted(file.FullPath) | ||||||
|  |                     .AppendSwitchSecret("-k", " ", apiKey) | ||||||
|  |             } | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(exitCode != 0) | ||||||
|  |     { | ||||||
|  |         throw new CakeException("Could not push GitHub packages."); | ||||||
|  |     } | ||||||
|  | }); | ||||||
|  |  | ||||||
| Task("Publish-NuGet") | Task("Publish-NuGet") | ||||||
|  //.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") |     // .WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") | ||||||
|  .IsDependentOn("Build") |     .IsDependentOn("Package") | ||||||
|  .Does(context => |     .Does(context => | ||||||
| { | { | ||||||
|  var apiKey = Argument<string>("nuget-key", null); |     var apiKey = Argument<string>("nuget-key", null); | ||||||
|  if(string.IsNullOrWhiteSpace(apiKey)) { |     if(string.IsNullOrWhiteSpace(apiKey)) { | ||||||
|      throw new CakeException("No NuGet API key was provided."); |         throw new CakeException("No NuGet API key was provided."); | ||||||
|  } |     } | ||||||
|  |  | ||||||
|  // Publish to GitHub Packages |     // Publish to GitHub Packages | ||||||
|  foreach(var file in context.GetFiles("./dist/NSExt/bin/Release/*.*")) |     foreach(var file in context.GetFiles($"{pkgOutPath}/*.*nupkg")) | ||||||
|  { |     { | ||||||
|      context.Information("Publishing {0}...", file.GetFilename().FullPath); |         context.Information("Publishing {0}...", file.GetFilename().FullPath); | ||||||
|      DotNetNuGetPush(file.FullPath, new DotNetNuGetPushSettings |         DotNetNuGetPush(file.FullPath, new DotNetNuGetPushSettings | ||||||
|      { |         { | ||||||
|          Source = "https://api.nuget.org/v3/index.json", |             Source = "https://api.nuget.org/v3/index.json", | ||||||
|          ApiKey = apiKey, |             ApiKey = apiKey, | ||||||
|          SkipDuplicate = true |             SkipDuplicate = true | ||||||
|      }); |         }); | ||||||
|  } |     } | ||||||
| }); | }); | ||||||
|  |  | ||||||
| //////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////// | ||||||
| // Targets | // Targets | ||||||
|  |  | ||||||
| Task("Publish") | Task("Publish") | ||||||
| //     .IsDependentOn("Publish-GitHub") |     //.IsDependentOn("Publish-GitHub") | ||||||
|     .IsDependentOn("Publish-NuGet"); |     .IsDependentOn("Publish-NuGet"); | ||||||
|  |  | ||||||
| Task("Default") | Task("Default") | ||||||
|     .IsDependentOn("Build"); |     .IsDependentOn("Package"); | ||||||
|  |  | ||||||
| //////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////// | ||||||
| // Execution | // Execution | ||||||
|   | |||||||
							
								
								
									
										3
									
								
								code-format.cmd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								code-format.cmd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | dot rbom -w | ||||||
|  | dot trim -w | ||||||
|  | dot tolf -w | ||||||
| @@ -1 +0,0 @@ | |||||||
| dotnet jb cleanupcode --no-build ./NSExt.sln |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
| <Project> |  | ||||||
|     <PropertyGroup> |  | ||||||
|         <CodeAnalysisRuleSet>$(SolutionDir)/stylecop.analyzers.ruleset</CodeAnalysisRuleSet> |  | ||||||
|     </PropertyGroup> |  | ||||||
|     <PropertyGroup Condition="'$(Configuration)' == 'Release'"> |  | ||||||
|         <CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors> |  | ||||||
|         <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> |  | ||||||
|         <MSBuildTreatWarningsAsErrors>true</MSBuildTreatWarningsAsErrors> |  | ||||||
|         <MSBuildWarningsAsErrors>true</MSBuildWarningsAsErrors> |  | ||||||
|         <TreatWarningsAsErrors>true</TreatWarningsAsErrors> |  | ||||||
|         <WarningsAsErrors>true</WarningsAsErrors> |  | ||||||
|     </PropertyGroup> |  | ||||||
|     <ItemGroup> |  | ||||||
|         <PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.507"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|         <PackageReference Include="Roslynator.Analyzers" Version="4.5.0"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|         <PackageReference Include="SonarAnalyzer.CSharp" Version="9.11.0.78383"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|         <PackageReference Include="AsyncSuffixAnalyzer" Version="1.0.6285.32977"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|         <PackageReference Include="AsyncFixer" Version="1.6.0"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|         <PackageReference Include="ProductiveRage.SealedClassVerification.Net" Version="1.7.0"> |  | ||||||
|             <PrivateAssets>all</PrivateAssets> |  | ||||||
|             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |  | ||||||
|         </PackageReference> |  | ||||||
|         <!--        <PackageReference Include="NSCodeAnalysis" Version="1.0.1-alpha.0.2">--> |  | ||||||
|         <!--            <PrivateAssets>all</PrivateAssets>--> |  | ||||||
|         <!--            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>--> |  | ||||||
|         <!--        </PackageReference>--> |  | ||||||
|     </ItemGroup> |  | ||||||
| </Project> |  | ||||||
| @@ -1,3 +0,0 @@ | |||||||
| dot rbom -w -e refs -e .git -e node_modules |  | ||||||
| dot trim -w -e refs -e .git -e node_modules |  | ||||||
| dot tolf -w -e refs -e .git -e node_modules |  | ||||||
| @@ -1,24 +1,6 @@ | |||||||
| { | { | ||||||
|   "version": 1, |     "version": 1, | ||||||
|   "isRoot": true, |     "isRoot": true, | ||||||
|   "tools": { |     "tools": { | ||||||
|     "cake.tool": { |  | ||||||
|       "version": "3.1.0", |  | ||||||
|       "commands": [ |  | ||||||
|         "dotnet-cake" |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     "dotnet-script": { |  | ||||||
|       "version": "1.4.0", |  | ||||||
|       "commands": [ |  | ||||||
|         "dotnet-script" |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     "jetbrains.resharper.globaltools": { |  | ||||||
|       "version": "2023.2.0", |  | ||||||
|       "commands": [ |  | ||||||
|         "jb" |  | ||||||
|       ] |  | ||||||
|     } |     } | ||||||
|   } |  | ||||||
| } | } | ||||||
							
								
								
									
										1
									
								
								git-clean.cmd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								git-clean.cmd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | git reset --hard | git clean -d -fx . | ||||||
							
								
								
									
										26
									
								
								git.pr.ps1
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								git.pr.ps1
									
									
									
									
									
								
							| @@ -1,26 +0,0 @@ | |||||||
| $types = @{ |  | ||||||
|     '1' = @('FEA', '新增特性') |  | ||||||
|     '2' = @('REF', '项目重构') |  | ||||||
|     '3' = @('FIX', '缺陷修复') |  | ||||||
|     '4' = @('PER', '性能优化') |  | ||||||
|     '5' = @('RVT', '还原变更') |  | ||||||
|     '6' = @('FMT', '格式整理') |  | ||||||
|     '7' = @('DOC', '文档变更') |  | ||||||
|     '8' = @('TST', '单元测试') |  | ||||||
|     '9' = @('BLD', '工程构建') |  | ||||||
| } |  | ||||||
| git add ./ |  | ||||||
| $prefix = '' |  | ||||||
| while ($null -eq $types[$prefix]) |  | ||||||
| { |  | ||||||
|     $prefix = Read-Host "请选择提交类型`n" $( & { param($i) $i | ForEach-Object { "$_ : $( $types[$_][0] )($( $types[$_][1] ))`n" } } $types.Keys | Sort-Object ) |  | ||||||
| } |  | ||||||
| git commit -m "[$($types[$prefix][0])] $(($(Read-Host '是否跳过自动构建?(Y/n)') -eq 'n') ? '': '[SKIP CI] ')$(Read-Host '请输入提交消息')" |  | ||||||
| $branch = $(git branch --show-current) |  | ||||||
| & './dot.clean.cmd' |  | ||||||
| git add ./ |  | ||||||
| git commit --amend --no-edit |  | ||||||
| git pull |  | ||||||
| git push --set-upstream origin $branch |  | ||||||
| Start-Process -FilePath "https://github.com/nsnail/NSExt/compare/main...$branch" |  | ||||||
| Pause |  | ||||||
| @@ -1,6 +0,0 @@ | |||||||
| $branch = $(git branch --show-current) |  | ||||||
| git checkout main |  | ||||||
| git pull |  | ||||||
| git branch -D $branch |  | ||||||
| git branch $branch |  | ||||||
| git checkout $branch |  | ||||||
							
								
								
									
										16
									
								
								global.json
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								global.json
									
									
									
									
									
								
							| @@ -1,10 +1,10 @@ | |||||||
| { | { | ||||||
|   "sdk": { |     "sdk": { | ||||||
|     "version": "7.0.0", |         "version": "7.0.100", | ||||||
|     "rollForward": "latestMajor", |         "allowPrerelease": true, | ||||||
|     "allowPrerelease": true |         "rollForward": "major" | ||||||
|   }, |     }, | ||||||
|   "tools": { |     "tools": { | ||||||
|     "dotnet": "7.0.0" |         "dotnet": "7.0.100" | ||||||
|   } |     } | ||||||
| } | } | ||||||
| @@ -1,65 +0,0 @@ | |||||||
| /* |  | ||||||
|             for %%i in (*.png) do pngquant %%i --force --output %%i --skip-if-larger |  | ||||||
|             for %%i in (*.jpg) do jpegtran -copy none -optimize -perfect %%i %%i |  | ||||||
|          * |  | ||||||
|          */ |  | ||||||
|  |  | ||||||
|  |  | ||||||
| var files = Directory |  | ||||||
|     .EnumerateFiles( |  | ||||||
|         "./", |  | ||||||
|         "*.png", |  | ||||||
|         new EnumerationOptions |  | ||||||
|         { |  | ||||||
|             RecurseSubdirectories = true, |  | ||||||
|             AttributesToSkip = FileAttributes.ReparsePoint, |  | ||||||
|             IgnoreInaccessible = true |  | ||||||
|         } |  | ||||||
|     ) |  | ||||||
|     .ToArray(); |  | ||||||
|  |  | ||||||
| Parallel.ForEach( |  | ||||||
|     files, |  | ||||||
|     file => |  | ||||||
|     { |  | ||||||
|         var startInfo = new ProcessStartInfo |  | ||||||
|         { |  | ||||||
|             FileName = "pngquant", |  | ||||||
|             Arguments = $"\"{file}\" --force --output \"{file}\" --skip-if-larger" |  | ||||||
|         }; |  | ||||||
|         using var p = Process.Start(startInfo); |  | ||||||
|         p.WaitForExit(); |  | ||||||
|         Console.WriteLine($"{file}: {p.ExitCode}"); |  | ||||||
|     } |  | ||||||
| ); |  | ||||||
|  |  | ||||||
| files = new[] { "*.jpg", "*.jpeg" } |  | ||||||
|     .SelectMany( |  | ||||||
|         x => |  | ||||||
|             Directory.EnumerateFiles( |  | ||||||
|                 "./", |  | ||||||
|                 x, |  | ||||||
|                 new EnumerationOptions |  | ||||||
|                 { |  | ||||||
|                     RecurseSubdirectories = true, |  | ||||||
|                     AttributesToSkip = FileAttributes.ReparsePoint, |  | ||||||
|                     IgnoreInaccessible = true |  | ||||||
|                 } |  | ||||||
|             ) |  | ||||||
|     ) |  | ||||||
|     .ToArray(); |  | ||||||
|  |  | ||||||
| Parallel.ForEach( |  | ||||||
|     files, |  | ||||||
|     file => |  | ||||||
|     { |  | ||||||
|         var startInfo = new ProcessStartInfo |  | ||||||
|         { |  | ||||||
|             FileName = "jpegtran", |  | ||||||
|             Arguments = $"-copy none -optimize -perfect \"{file}\" \"{file}\"" |  | ||||||
|         }; |  | ||||||
|         using var p = Process.Start(startInfo); |  | ||||||
|         p.WaitForExit(); |  | ||||||
|         Console.WriteLine($"{file}: {p.ExitCode}"); |  | ||||||
|     } |  | ||||||
| ); |  | ||||||
| @@ -1,8 +0,0 @@ | |||||||
| <?xml version="1.0" encoding="utf-8"?> |  | ||||||
|  |  | ||||||
| <configuration> |  | ||||||
|     <packageSources> |  | ||||||
|         <clear /> |  | ||||||
|         <add key="nuget.cdn.azure.cn" value="https://nuget.cdn.azure.cn/v3/index.json" /> |  | ||||||
|     </packageSources> |  | ||||||
| </configuration> |  | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| <Project> |  | ||||||
|     <PropertyGroup> |  | ||||||
|         <AssemblyOriginatorKeyFile>../../key.snk</AssemblyOriginatorKeyFile> |  | ||||||
|         <DelaySign>false</DelaySign> |  | ||||||
|         <EmbedAllSources>true</EmbedAllSources> |  | ||||||
|         <EmbedUntrackedSource>true</EmbedUntrackedSource> |  | ||||||
|         <GeneratePackageOnBuild>true</GeneratePackageOnBuild> |  | ||||||
|         <IncludeSymbols>true</IncludeSymbols> |  | ||||||
|         <IsPackable>true</IsPackable> |  | ||||||
|         <PackageIcon>logo.png</PackageIcon> |  | ||||||
|         <PackageLicenseExpression>MIT</PackageLicenseExpression> |  | ||||||
|         <PackageProjectUrl>https://github.com/nsnail/NSExt.git</PackageProjectUrl> |  | ||||||
|         <PackageTags>extensions</PackageTags> |  | ||||||
|         <PublishRepositoryUrl>true</PublishRepositoryUrl> |  | ||||||
|         <SignAssembly>true</SignAssembly> |  | ||||||
|         <SymbolPackageFormat>snupkg</SymbolPackageFormat> |  | ||||||
|     </PropertyGroup> |  | ||||||
| </Project> |  | ||||||
							
								
								
									
										25
									
								
								push2nuget.ps1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								push2nuget.ps1
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | Param( | ||||||
|  | # Nuget APIKey | ||||||
|  |     [string] $apikey | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | if ($apikey -eq $null -or $apikey -eq "") | ||||||
|  | { | ||||||
|  |     Write-Error "require apiKey"; | ||||||
|  |     return; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | rm -r ./build/nupkgs | ||||||
|  | dotnet build -c Release | ||||||
|  | $files = Get-ChildItem -Path ./build/nupkgs/ -Filter *.nupkg | ||||||
|  | foreach ($file in $files) | ||||||
|  | { | ||||||
|  |     dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json | ||||||
|  |     nuget add $file.fullName -source d:\nuget-pkg | ||||||
|  | } | ||||||
|  | $files = Get-ChildItem -Path ./build/nupkgs/ -Filter *.snupkg | ||||||
|  | foreach ($file in $files) | ||||||
|  | { | ||||||
|  |     dotnet nuget push $file.fullName --skip-duplicate --api-key $apikey --source https://api.nuget.org/v3/index.json | ||||||
|  |     nuget add $file.fullName -source d:\nuget-pkg | ||||||
|  | } | ||||||
| @@ -8,7 +8,7 @@ public static class ByteExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     base64编码 |     ///     base64编码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待编码的字节数组</param> | ||||||
|     /// <returns>编码后的base64字符串</returns> |     /// <returns>编码后的base64字符串</returns> | ||||||
|     public static string Base64(this byte[] me) |     public static string Base64(this byte[] me) | ||||||
|     { |     { | ||||||
| @@ -18,7 +18,7 @@ public static class ByteExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字节数组解码成字符串 |     ///     将字节数组解码成字符串 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字节数组</param> | ||||||
|     /// <param name="e">字符串使用的编码方式</param> |     /// <param name="e">字符串使用的编码方式</param> | ||||||
|     /// <returns>解码后的原始字符串</returns> |     /// <returns>解码后的原始字符串</returns> | ||||||
|     public static string HexDe(this byte[] me, Encoding e) |     public static string HexDe(this byte[] me, Encoding e) | ||||||
| @@ -29,7 +29,7 @@ public static class ByteExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字节数组解码成字符串 |     ///     将字节数组解码成字符串 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字节数组</param> | ||||||
|     /// <returns>解码后的原始字符串</returns> |     /// <returns>解码后的原始字符串</returns> | ||||||
|     public static string HexDe(this byte[] me) |     public static string HexDe(this byte[] me) | ||||||
|     { |     { | ||||||
| @@ -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 Str(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; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,7 +1,8 @@ | |||||||
| // ReSharper disable InconsistentNaming | // ReSharper disable InconsistentNaming | ||||||
| // ReSharper disable UnusedMember.Global | // ReSharper disable UnusedMember.Global | ||||||
| 
 | 
 | ||||||
| #pragma warning disable SA1300, IDE1006 | #pragma warning disable SA1300 | ||||||
|  | #pragma warning disable IDE1006 | ||||||
| namespace NSExt.Extensions; | namespace NSExt.Extensions; | ||||||
| 
 | 
 | ||||||
| /// <summary> | /// <summary> | ||||||
| @@ -9,10 +10,23 @@ namespace NSExt.Extensions; | |||||||
| /// </summary> | /// </summary> | ||||||
| public static class DateTimeExtensions | public static class DateTimeExtensions | ||||||
| { | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     将一个过去时间对象与当前时间相减转换成“xx以前”的字符串, 如2秒以前, 3天以前 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="me">时间对象</param> | ||||||
|  |     /// <returns>字符串</returns> | ||||||
|  |     public static string TimeAgo(this DateTime me) | ||||||
|  |     { | ||||||
|  |         var ts = DateTime.Now - me; | ||||||
|  |         return ts.Days > 0 ? ts.Days    + "天前" : | ||||||
|  |             ts.Hours   > 0 ? ts.Hours   + "小时前" : | ||||||
|  |             ts.Minutes > 0 ? ts.Minutes + "分钟前" : ts.Seconds + "秒前"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     指定时间的世界协调时的unix时间戳形式 |     ///     指定时间的世界协调时的unix时间戳形式 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">指定时间</param> | ||||||
|     /// <returns>unix时间戳</returns> |     /// <returns>unix时间戳</returns> | ||||||
|     public static long TimeUnixUtc(this DateTime me) |     public static long TimeUnixUtc(this DateTime me) | ||||||
|     { |     { | ||||||
| @@ -27,31 +41,6 @@ public static class DateTimeExtensions | |||||||
|         return (me.ToUniversalTime().Ticks - 621355968000000000) / 10000; |         return (me.ToUniversalTime().Ticks - 621355968000000000) / 10000; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |  | ||||||
|     ///     ToString 的 Invariant 版本 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ToInvString(this DateTime me) |  | ||||||
|     { |  | ||||||
|         return me.ToString(CultureInfo.InvariantCulture); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     ///     将一个过去时间对象与当前时间相减转换成“xx以前”的字符串, 如2秒以前, 3天以前 |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="me">me</param> |  | ||||||
|     /// <returns>字符串</returns> |  | ||||||
|     public static string UtcTimeAgo(this DateTime me) |  | ||||||
|     { |  | ||||||
|         var ts = DateTime.UtcNow - me; |  | ||||||
|         return ts.Days switch { |  | ||||||
|                    > 0 => ts.Days + "天前" |  | ||||||
|                  , _ => ts.Hours switch { |  | ||||||
|                             > 0 => ts.Hours + "小时前" |  | ||||||
|                           , _   => ts.Minutes switch { > 0 => ts.Minutes + "分钟前", _ => ts.Seconds + "秒前" } |  | ||||||
|                         } |  | ||||||
|                }; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     yyyy_MM |     ///     yyyy_MM | ||||||
|     /// </summary> |     /// </summary> | ||||||
							
								
								
									
										47
									
								
								src/Extensions/DbCommandExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/Extensions/DbCommandExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | namespace NSExt.Extensions; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     DbCommandExtensions | ||||||
|  | /// </summary> | ||||||
|  | public static class DbCommandExtensions | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     格式化参数拼接成完整的SQL语句 | ||||||
|  |     /// </summary> | ||||||
|  |     public static string ParameterFormat(this DbCommand me) | ||||||
|  |     { | ||||||
|  |         //var aa = pars.ToDictionary(it => it.ParameterName, it => it.Value); | ||||||
|  |         var sql = me.CommandText; | ||||||
|  |  | ||||||
|  |         //应逆向替换,否则由于 多个表的过滤器问题导致替换不完整  如 @TenantId1  @TenantId10 | ||||||
|  |         for (var i = me.Parameters.Count - 1; i >= 0; i--) { | ||||||
|  |             sql = me.Parameters[i].DbType switch { | ||||||
|  |                       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.AnsiString or DbType.StringFixedLength => sql.Replace( // | ||||||
|  |                               me.Parameters[i].ParameterName, "'" + me.Parameters[i].Value + "'") | ||||||
|  |                     , DbType.Boolean => sql.Replace( // | ||||||
|  |                           me.Parameters[i].ParameterName | ||||||
|  |                         , 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()) | ||||||
|  |                   }; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return sql; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -8,19 +8,12 @@ public static class DecimalExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     四舍五入后的近似值 |     ///     四舍五入后的近似值 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">数字</param> | ||||||
|     /// <param name="place">小数点位数</param> |     /// <param name="place">小数点位数</param> | ||||||
|     /// <returns>处理后的值</returns> |     /// <returns>处理后的值</returns> | ||||||
|     public static decimal Round(this decimal me, int place) |     public static decimal Round(this decimal me, int place) | ||||||
|     { |     { | ||||||
|         return Math.Round(me, place); |         var dec = Math.Round(me, place); | ||||||
|     } |         return dec; | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     ///     ToString 的 Invariant 版本 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ToInvString(this decimal me) |  | ||||||
|     { |  | ||||||
|         return me.ToString(CultureInfo.InvariantCulture); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
							
								
								
									
										20
									
								
								src/Extensions/EnumExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/Extensions/EnumExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | |||||||
|  | namespace NSExt.Extensions; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     EnumExtensions | ||||||
|  | /// </summary> | ||||||
|  | public static class EnumExtensions | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     获取枚举的description属性 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="e">枚举对象</param> | ||||||
|  |     /// <returns>description属性</returns> | ||||||
|  |     public static string Desc(this Enum e) | ||||||
|  |     { | ||||||
|  |         var t     = e.GetType(); | ||||||
|  |         var fi    = t.GetField(Enum.GetName(t, e)!); | ||||||
|  |         var attrs = (DescriptionAttribute[])fi!.GetCustomAttributes(typeof(DescriptionAttribute), false); | ||||||
|  |         return (attrs.Length != 0 ? attrs[0].Description : Enum.GetName(t, e)) ?? string.Empty; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -17,10 +17,10 @@ public static class EnumerableExtensions | |||||||
|     ///     判断对象是否为null或不存在子元素(如果为集合对象) |     ///     判断对象是否为null或不存在子元素(如果为集合对象) | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <typeparam name="T">对象类型</typeparam> |     /// <typeparam name="T">对象类型</typeparam> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">指定对象</param> | ||||||
|     /// <returns>空则返回true</returns> |     /// <returns>空则返回true</returns> | ||||||
|     public static bool NullOrEmpty<T>(this IEnumerable<T> me) |     public static bool NullOrEmpty<T>(this IEnumerable<T> me) | ||||||
|     { |     { | ||||||
|         return me?.Any() != true; |         return me is null || !me.Any(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -9,7 +9,7 @@ public static class GenericExtensions | |||||||
|     ///     从指定的对象拷贝属性 |     ///     从指定的对象拷贝属性 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <typeparam name="T">对象类型</typeparam> |     /// <typeparam name="T">对象类型</typeparam> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">拷贝目标</param> | ||||||
|     /// <param name="copyObj">拷贝来源</param> |     /// <param name="copyObj">拷贝来源</param> | ||||||
|     /// <param name="propNameList">需要处理的属性名</param> |     /// <param name="propNameList">需要处理的属性名</param> | ||||||
|     /// <param name="isIncludeOrExclude">True包含,false排除</param> |     /// <param name="isIncludeOrExclude">True包含,false排除</param> | ||||||
| @@ -17,20 +17,12 @@ public static class IntExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     生成随机数 |     ///     生成随机数 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">大于等于[0],小于[1]</param> | ||||||
|     public static int Rand(this int[] me) |     public static int Rand(this int[] me) | ||||||
|     { |     { | ||||||
|         return new Random(Guid.NewGuid().GetHashCode()).Next(me[0], me[1]); |         return new Random(Guid.NewGuid().GetHashCode()).Next(me[0], me[1]); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |  | ||||||
|     ///     ToString 的 Invariant 版本 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ToInvString(this int me) |  | ||||||
|     { |  | ||||||
|         return me.ToString(CultureInfo.InvariantCulture); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     转换成ipv4 |     ///     转换成ipv4 | ||||||
|     /// </summary> |     /// </summary> | ||||||
							
								
								
									
										29
									
								
								src/Extensions/JsonSerializerOptionsExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/Extensions/JsonSerializerOptionsExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | using System.Text.Encodings.Web; | ||||||
|  | using System.Text.Json; | ||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace NSExt.Extensions; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     JsonSerializerOptionsExtensions | ||||||
|  | /// </summary> | ||||||
|  | public static class JsonSerializerOptionsExtensions | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     NewJsonSerializerOptions | ||||||
|  |     /// </summary> | ||||||
|  |     public static JsonSerializerOptions NewJsonSerializerOptions(this JsonSerializerOptions _) | ||||||
|  |     { | ||||||
|  |         return new JsonSerializerOptions { | ||||||
|  |                                              ReadCommentHandling  = JsonCommentHandling.Skip | ||||||
|  |                                            , AllowTrailingCommas  = true | ||||||
|  |                                            , DictionaryKeyPolicy  = JsonNamingPolicy.CamelCase | ||||||
|  |                                            , PropertyNamingPolicy = JsonNamingPolicy.CamelCase | ||||||
|  |                                            , Encoder              = JavaScriptEncoder.UnsafeRelaxedJsonEscaping | ||||||
|  |                                            , NumberHandling | ||||||
|  |                                                  = JsonNumberHandling.AllowReadingFromString | | ||||||
|  |                                                    JsonNumberHandling.WriteAsString | ||||||
|  |                                            , PropertyNameCaseInsensitive = true | ||||||
|  |                                          }; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										88
									
								
								src/Extensions/LoggerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/Extensions/LoggerExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | // ReSharper disable TemplateIsNotCompileTimeConstantProblem | ||||||
|  |  | ||||||
|  | namespace NSExt.Extensions; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     LoggerExtensions | ||||||
|  | /// </summary> | ||||||
|  | public static class LoggerExtensions | ||||||
|  | { | ||||||
|  |     private const string _MESSAGE_S_THREADID_CALLERNAME_CALLERFILEPATH_CALLERLINENUMBER | ||||||
|  |         = "{Message} <s:{ThreadId}#{CallerName}@{CallerFilePath}:{CallerLineNumber}>"; | ||||||
|  |  | ||||||
|  |     private static readonly Action<ILogger, string, string, string, string, string, Exception> _logDebug | ||||||
|  |         = LoggerMessage.Define<string, string, string, string, string>(LogLevel.Debug, default | ||||||
|  |                                                                      , _MESSAGE_S_THREADID_CALLERNAME_CALLERFILEPATH_CALLERLINENUMBER); | ||||||
|  |  | ||||||
|  |     private static readonly Action<ILogger, string, string, string, string, string, Exception> _logError | ||||||
|  |         = LoggerMessage.Define<string, string, string, string, string>(LogLevel.Error, default | ||||||
|  |                                                                      , _MESSAGE_S_THREADID_CALLERNAME_CALLERFILEPATH_CALLERLINENUMBER); | ||||||
|  |  | ||||||
|  |     private static readonly Action<ILogger, string, string, string, string, string, Exception> _logFatal | ||||||
|  |         = LoggerMessage.Define<string, string, string, string, string>(LogLevel.Critical, default | ||||||
|  |                                                                      , _MESSAGE_S_THREADID_CALLERNAME_CALLERFILEPATH_CALLERLINENUMBER); | ||||||
|  |  | ||||||
|  |     private static readonly Action<ILogger, string, string, string, string, string, Exception> _logInfo | ||||||
|  |         = LoggerMessage.Define<string, string, string, string, string>(LogLevel.Information, default | ||||||
|  |                                                                      , _MESSAGE_S_THREADID_CALLERNAME_CALLERFILEPATH_CALLERLINENUMBER); | ||||||
|  |  | ||||||
|  |     private static readonly Action<ILogger, string, string, string, string, string, Exception> _logWarn | ||||||
|  |         = LoggerMessage.Define<string, string, string, string, string>(LogLevel.Warning, default | ||||||
|  |                                                                      , _MESSAGE_S_THREADID_CALLERNAME_CALLERFILEPATH_CALLERLINENUMBER); | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     Debug | ||||||
|  |     /// </summary> | ||||||
|  |     public static void Debug(this             ILogger me, object message, [CallerMemberName] string callerName = null | ||||||
|  |                            , [CallerFilePath] string callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) | ||||||
|  |     { | ||||||
|  |         _logDebug(me, message.ToString(), Environment.CurrentManagedThreadId.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                 , callerName, Path.GetFileName(callerFilePath), callerLineNumber.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                 , null); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     Error | ||||||
|  |     /// </summary> | ||||||
|  |     public static void Error(this             ILogger me, object message, [CallerMemberName] string callerName = null | ||||||
|  |                            , [CallerFilePath] string callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) | ||||||
|  |     { | ||||||
|  |         _logError(me, message.ToString(), Environment.CurrentManagedThreadId.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                 , callerName, Path.GetFileName(callerFilePath), callerLineNumber.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                 , null); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     Fatal | ||||||
|  |     /// </summary> | ||||||
|  |     public static void Fatal(this               ILogger me, object message, Exception ex = null | ||||||
|  |                            , [CallerMemberName] string  callerName = null, [CallerFilePath] string callerFilePath = null | ||||||
|  |                            , [CallerLineNumber] int     callerLineNumber = 0) | ||||||
|  |     { | ||||||
|  |         _logFatal(me, message.ToString(), Environment.CurrentManagedThreadId.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                 , callerName, Path.GetFileName(callerFilePath), callerLineNumber.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                 , ex); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     Info | ||||||
|  |     /// </summary> | ||||||
|  |     public static void Info(this             ILogger me, object message, [CallerMemberName] string callerName = null | ||||||
|  |                           , [CallerFilePath] string  callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) | ||||||
|  |     { | ||||||
|  |         _logInfo(me, message.ToString(), Environment.CurrentManagedThreadId.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                , callerName, Path.GetFileName(callerFilePath), callerLineNumber.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                , null); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     Warn | ||||||
|  |     /// </summary> | ||||||
|  |     public static void Warn(this             ILogger me, object message, [CallerMemberName] string callerName = null | ||||||
|  |                           , [CallerFilePath] string  callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) | ||||||
|  |     { | ||||||
|  |         _logWarn(me, message.ToString(), Environment.CurrentManagedThreadId.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                , callerName, Path.GetFileName(callerFilePath), callerLineNumber.ToString(CultureInfo.InvariantCulture) | ||||||
|  |                , null); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								src/Extensions/LongExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/Extensions/LongExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | namespace NSExt.Extensions; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     LongExtensions | ||||||
|  | /// </summary> | ||||||
|  | public static class LongExtensions | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     判断枚举是否包含某个位 | ||||||
|  |     /// </summary> | ||||||
|  |     public static bool HasFlag<T>(this long me, T flag) | ||||||
|  |         where T : Enum | ||||||
|  |     { | ||||||
|  |         var val = (long)(object)flag; | ||||||
|  |         return (me & val) == val; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /// <summary> | ||||||
|  |     ///     1970毫秒数转换成日期对象 | ||||||
|  |     /// </summary> | ||||||
|  |     public static DateTime Time(this long msFrom1970) | ||||||
|  |     { | ||||||
|  |         return new DateTime(1970, 1, 1).AddMilliseconds(msFrom1970).ToLocalTime(); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								src/Extensions/ObjectExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/Extensions/ObjectExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
|  | namespace NSExt.Extensions; | ||||||
|  |  | ||||||
|  | /// <summary> | ||||||
|  | ///     ObjectExtensions | ||||||
|  | /// </summary> | ||||||
|  | public static class ObjectExtensions | ||||||
|  | { | ||||||
|  |     /// <summary> | ||||||
|  |     ///     将一个对象序列化成json文本 | ||||||
|  |     /// </summary> | ||||||
|  |     /// <param name="me">指定对象</param> | ||||||
|  |     /// <param name="format">是否格式化</param> | ||||||
|  |     /// <returns>json文本</returns> | ||||||
|  |     public static string Json(this object me, bool format = false) | ||||||
|  |     { | ||||||
|  |         return JsonSerializer.Serialize( | ||||||
|  |             me, new JsonSerializerOptions { WriteIndented = format, PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -4,20 +4,21 @@ | |||||||
| #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> | ||||||
| #pragma warning disable CodeLinesAnalyzer | public static partial class StringExtensions | ||||||
| public static class StringExtensions |  | ||||||
| { | { | ||||||
|  |     private static readonly JsonSerializerOptions _defaultJsonSerializerOptions | ||||||
|  |         = default(JsonSerializerOptions).NewJsonSerializerOptions(); | ||||||
|  | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     aes加密 |     ///     aes加密 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">要加密的串</param> | ||||||
|     /// <param name="key">密钥</param> |     /// <param name="key">密钥</param> | ||||||
|     public static string Aes(this string me, string key) |     public static string Aes(this string me, string key) | ||||||
|     { |     { | ||||||
| @@ -34,7 +35,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     aes解密 |     ///     aes解密 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">要加密的串</param> | ||||||
|     /// <param name="key">密钥</param> |     /// <param name="key">密钥</param> | ||||||
|     public static string AesDe(this string me, string key) |     public static string AesDe(this string me, string key) | ||||||
|     { |     { | ||||||
| @@ -51,7 +52,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     base64编码 |     ///     base64编码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待base64编码的字符串</param> | ||||||
|     /// <param name="e">字符串的编码方式</param> |     /// <param name="e">字符串的编码方式</param> | ||||||
|     /// <returns>编码后的base64字符串</returns> |     /// <returns>编码后的base64字符串</returns> | ||||||
|     public static string Base64(this string me, Encoding e) |     public static string Base64(this string me, Encoding e) | ||||||
| @@ -62,7 +63,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     base64解码 |     ///     base64解码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待解码的字符串</param> | ||||||
|     /// <returns>解码后的原始字节数组</returns> |     /// <returns>解码后的原始字节数组</returns> | ||||||
|     public static byte[] Base64De(this string me) |     public static byte[] Base64De(this string me) | ||||||
|     { |     { | ||||||
| @@ -72,7 +73,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     base64解码 |     ///     base64解码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待解码的字符串</param> | ||||||
|     /// <param name="e">字符串的编码方式</param> |     /// <param name="e">字符串的编码方式</param> | ||||||
|     /// <returns>解码后的原始字符串</returns> |     /// <returns>解码后的原始字符串</returns> | ||||||
|     public static string Base64De(this string me, Encoding e) |     public static string Base64De(this string me, Encoding e) | ||||||
| @@ -101,7 +102,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成日期对象 |     ///     将字符串转换成日期对象 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待转换字符串</param> | ||||||
|     /// <returns>转换后的日期对象</returns> |     /// <returns>转换后的日期对象</returns> | ||||||
|     public static DateTime DateTime(this string me) |     public static DateTime DateTime(this string me) | ||||||
|     { |     { | ||||||
| @@ -111,7 +112,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成日期对象 |     ///     将字符串转换成日期对象 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待转换字符串</param> | ||||||
|     /// <param name="format">日期格式</param> |     /// <param name="format">日期格式</param> | ||||||
|     /// <returns>转换后的日期对象</returns> |     /// <returns>转换后的日期对象</returns> | ||||||
|     public static DateTime DateTimeExact(this string me, string format) |     public static DateTime DateTimeExact(this string me, string format) | ||||||
| @@ -122,7 +123,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成日期对象 |     ///     将字符串转换成日期对象 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待转换字符串</param> | ||||||
|     /// <param name="format">日期格式</param> |     /// <param name="format">日期格式</param> | ||||||
|     /// <param name="def">转换失败时返回的日期对象</param> |     /// <param name="def">转换失败时返回的日期对象</param> | ||||||
|     /// <returns>转换后的日期对象</returns> |     /// <returns>转换后的日期对象</returns> | ||||||
| @@ -136,18 +137,18 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成日期对象 |     ///     将字符串转换成日期对象 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">待转换字符串</param> | ||||||
|     /// <param name="def">转换失败时返回的日期对象</param> |     /// <param name="def">转换失败时返回的日期对象</param> | ||||||
|     /// <returns>转换后的日期对象</returns> |     /// <returns>转换后的日期对象</returns> | ||||||
|     public static DateTime DateTimeTry(this string me, DateTime def) |     public static DateTime DateTimeTry(this string me, DateTime def) | ||||||
|     { |     { | ||||||
|         return !System.DateTime.TryParse(me, CultureInfo.InvariantCulture, out var ret) ? def : ret; |         return !System.DateTime.TryParse(me, out var ret) ? def : ret; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     string to decimal |     ///     string to decimal | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">string</param> | ||||||
|     /// <returns>decimal</returns> |     /// <returns>decimal</returns> | ||||||
|     public static decimal Dec(this string me) |     public static decimal Dec(this string me) | ||||||
|     { |     { | ||||||
| @@ -157,7 +158,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     尝试将字符串转为decimal |     ///     尝试将字符串转为decimal | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="def">转换失败后返回的默认值</param> |     /// <param name="def">转换失败后返回的默认值</param> | ||||||
|     /// <returns>转换后的decimal</returns> |     /// <returns>转换后的decimal</returns> | ||||||
|     public static decimal DecTry(this string me, decimal def) |     public static decimal DecTry(this string me, decimal def) | ||||||
| @@ -168,7 +169,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     string to double |     ///     string to double | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">string</param> | ||||||
|     /// <returns>Int32</returns> |     /// <returns>Int32</returns> | ||||||
|     public static double Double(this string me) |     public static double Double(this string me) | ||||||
|     { |     { | ||||||
| @@ -196,7 +197,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     string to float |     ///     string to float | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">string</param> | ||||||
|     /// <returns>Int32</returns> |     /// <returns>Int32</returns> | ||||||
|     public static float Float(this string me) |     public static float Float(this string me) | ||||||
|     { |     { | ||||||
| @@ -206,7 +207,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转为guid |     ///     将字符串转为guid | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     public static Guid Guid(this string me) |     public static Guid Guid(this string me) | ||||||
|     { |     { | ||||||
|         return System.Guid.Parse(me); |         return System.Guid.Parse(me); | ||||||
| @@ -215,7 +216,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成guid |     ///     将字符串转换成guid | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="def">转换失败的返回值</param> |     /// <param name="def">转换失败的返回值</param> | ||||||
|     public static Guid Guid(this string me, Guid def) |     public static Guid Guid(this string me, Guid def) | ||||||
|     { |     { | ||||||
| @@ -225,7 +226,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成字节数组形式 |     ///     将字符串转换成字节数组形式 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="e">字符串使用的编码</param> |     /// <param name="e">字符串使用的编码</param> | ||||||
|     /// <returns>字节数组</returns> |     /// <returns>字节数组</returns> | ||||||
|     public static byte[] Hex(this string me, Encoding e) |     public static byte[] Hex(this string me, Encoding e) | ||||||
| @@ -236,7 +237,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将字符串转换成字节数组形式 |     ///     将字符串转换成字节数组形式 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <returns>字节数组</returns> |     /// <returns>字节数组</returns> | ||||||
|     public static byte[] Hex(this string me) |     public static byte[] Hex(this string me) | ||||||
|     { |     { | ||||||
| @@ -252,9 +253,7 @@ public static class StringExtensions | |||||||
|     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> |     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> | ||||||
|     public static string HmacSha1(this string me, string secret, Encoding e) |     public static string HmacSha1(this string me, string secret, Encoding e) | ||||||
|     { |     { | ||||||
|         #pragma warning disable CA5350 |  | ||||||
|         using var hmacSha1 = new HMACSHA1(e.GetBytes(secret)); |         using var hmacSha1 = new HMACSHA1(e.GetBytes(secret)); | ||||||
|         #pragma warning restore CA5350 |  | ||||||
| 
 | 
 | ||||||
|         return BitConverter.ToString(hmacSha1.ComputeHash(e.GetBytes(me))) |         return BitConverter.ToString(hmacSha1.ComputeHash(e.GetBytes(me))) | ||||||
|                            .Replace("-", string.Empty) |                            .Replace("-", string.Empty) | ||||||
| @@ -272,7 +271,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     解码html编码 |     ///     解码html编码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">html编码后的字符串</param> | ||||||
|     /// <returns>解码后的原始字符串</returns> |     /// <returns>解码后的原始字符串</returns> | ||||||
|     public static string HtmlDe(this string me) |     public static string HtmlDe(this string me) | ||||||
|     { |     { | ||||||
| @@ -282,7 +281,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     string to Int32 |     ///     string to Int32 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">string</param> | ||||||
|     /// <returns>Int32</returns> |     /// <returns>Int32</returns> | ||||||
|     public static int Int32(this string me) |     public static int Int32(this string me) | ||||||
|     { |     { | ||||||
| @@ -292,7 +291,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     尝试将字符串转为int32 |     ///     尝试将字符串转为int32 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="def">转换失败后返回的默认值</param> |     /// <param name="def">转换失败后返回的默认值</param> | ||||||
|     /// <returns>转换后的int32</returns> |     /// <returns>转换后的int32</returns> | ||||||
|     public static int Int32Try(this string me, int def) |     public static int Int32Try(this string me, int def) | ||||||
| @@ -303,7 +302,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     string to Int64 |     ///     string to Int64 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">string</param> | ||||||
|     /// <returns>Int64</returns> |     /// <returns>Int64</returns> | ||||||
|     public static long Int64(this string me) |     public static long Int64(this string me) | ||||||
|     { |     { | ||||||
| @@ -313,7 +312,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     尝试将字符串转为int64 |     ///     尝试将字符串转为int64 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="def">转换失败后返回的默认值</param> |     /// <param name="def">转换失败后返回的默认值</param> | ||||||
|     /// <returns>转换后的int64</returns> |     /// <returns>转换后的int64</returns> | ||||||
|     public static long Int64Try(this string me, long def) |     public static long Int64Try(this string me, long def) | ||||||
| @@ -332,7 +331,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     是否base64字符串 |     ///     是否base64字符串 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     public static bool IsBase64String(this string me) |     public static bool IsBase64String(this string me) | ||||||
|     { |     { | ||||||
|         // 一个合法的Base64,有着以下特征: |         // 一个合法的Base64,有着以下特征: | ||||||
| @@ -366,24 +365,22 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     对一个手机号进行掩码处理 |     ///     对一个手机号进行掩码处理 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">手机号</param> | ||||||
|     /// <returns>掩码后的手机号</returns> |     /// <returns>掩码后的手机号</returns> | ||||||
|     public static string MaskMobile(this string me) |     public static string MaskMobile(this string me) | ||||||
|     { |     { | ||||||
|         return Regexes.RegexMobile.Replace(me, "$1****$2"); |         return MyRegex().Replace(me, "$1****$2"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     对一个字符串进行md5hash运算 |     ///     对一个字符串进行md5hash运算 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="e">字符串使用的编码</param> |     /// <param name="e">字符串使用的编码</param> | ||||||
|     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> |     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> | ||||||
|     public static string Md5(this string me, Encoding e) |     public static string Md5(this string me, Encoding e) | ||||||
|     { |     { | ||||||
|         #pragma warning disable CA5351 |  | ||||||
|         return BitConverter.ToString(MD5.HashData(e.GetBytes(me))) |         return BitConverter.ToString(MD5.HashData(e.GetBytes(me))) | ||||||
|                            #pragma warning restore CA5351 |  | ||||||
|                            .Replace("-", string.Empty) |                            .Replace("-", string.Empty) | ||||||
|                            .ToLower(CultureInfo.CurrentCulture); |                            .ToLower(CultureInfo.CurrentCulture); | ||||||
|     } |     } | ||||||
| @@ -391,7 +388,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     判断字符串是否为null或不存在子元素(如果为集合对象);如果为空,返回指定的默认值,否则返回字符串本身 |     ///     判断字符串是否为null或不存在子元素(如果为集合对象);如果为空,返回指定的默认值,否则返回字符串本身 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">指定字符串</param> | ||||||
|     /// <param name="defVal">指定的默认值</param> |     /// <param name="defVal">指定的默认值</param> | ||||||
|     /// <returns>如果为空,返回指定的默认值,否则返回字符串本身</returns> |     /// <returns>如果为空,返回指定的默认值,否则返回字符串本身</returns> | ||||||
|     public static string NullOrEmpty(this string me, string defVal) |     public static string NullOrEmpty(this string me, string defVal) | ||||||
| @@ -410,30 +407,30 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     反序列化一个文件获得指定类型的数据对象 |     ///     反序列化一个文件获得指定类型的数据对象 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">等待反序列化的json文本</param> | ||||||
|     /// <param name="options">序列化选项</param> |     /// <param name="options">序列化选项</param> | ||||||
|     /// <returns>反序列化后生成的对象</returns> |     /// <returns>反序列化后生成的对象</returns> | ||||||
|     public static T Object<T>(this string me, JsonSerializerOptions options = null) |     public static T Object<T>(this string me, JsonSerializerOptions options = null) | ||||||
|     { |     { | ||||||
|         return JsonSerializer.Deserialize<T>(me, options); |         return JsonSerializer.Deserialize<T>(me, options ?? _defaultJsonSerializerOptions); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     反序列化一个文件获得指定类型的数据对象 |     ///     反序列化一个文件获得指定类型的数据对象 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">等待反序列化的json文本</param> | ||||||
|     /// <param name="type">实际类型</param> |     /// <param name="type">实际类型</param> | ||||||
|     /// <param name="options">序列化选项</param> |     /// <param name="options">序列化选项</param> | ||||||
|     /// <returns>反序列化后生成的对象</returns> |     /// <returns>反序列化后生成的对象</returns> | ||||||
|     public static object Object(this string me, Type type, JsonSerializerOptions options = null) |     public static object Object(this string me, Type type, JsonSerializerOptions options = null) | ||||||
|     { |     { | ||||||
|         return JsonSerializer.Deserialize(me, type, options); |         return JsonSerializer.Deserialize(me, type, options ?? _defaultJsonSerializerOptions); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     生成密码 |     ///     生成密码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">密码原文</param> | ||||||
|     /// <returns>密文</returns> |     /// <returns>密文</returns> | ||||||
|     public static string Pwd(this string me) |     public static string Pwd(this string me) | ||||||
|     { |     { | ||||||
| @@ -443,11 +440,11 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     移除字符串中的html标签 |     ///     移除字符串中的html标签 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <returns>处理之后的字符串</returns> |     /// <returns>处理之后的字符串</returns> | ||||||
|     public static string RemoveHtmlTag(this string me) |     public static string RemoveHtmlTag(this string me) | ||||||
|     { |     { | ||||||
|         return Regexes.RegexHtmlTag.Replace(me, string.Empty); |         return MyRegex1().Replace(me, string.Empty); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
| @@ -461,14 +458,12 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     对一个字符串进行sha1 hash运算 |     ///     对一个字符串进行sha1 hash运算 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="e">字符串使用的编码</param> |     /// <param name="e">字符串使用的编码</param> | ||||||
|     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> |     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> | ||||||
|     public static string Sha1(this string me, Encoding e) |     public static string Sha1(this string me, Encoding e) | ||||||
|     { |     { | ||||||
|         #pragma warning disable CA5350 |  | ||||||
|         return BitConverter.ToString(SHA1.HashData(e.GetBytes(me))) |         return BitConverter.ToString(SHA1.HashData(e.GetBytes(me))) | ||||||
|                            #pragma warning restore CA5350 |  | ||||||
|                            .Replace("-", string.Empty) |                            .Replace("-", string.Empty) | ||||||
|                            .ToLower(CultureInfo.CurrentCulture); |                            .ToLower(CultureInfo.CurrentCulture); | ||||||
|     } |     } | ||||||
| @@ -476,9 +471,9 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     蛇形命名 |     ///     蛇形命名 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     public static string SnakeCase(this string me) |     public static string Snakecase(this string me) | ||||||
|     { |     { | ||||||
|         return Regexes.RegexUpLetter.Replace(me, "-$1").ToLower(CultureInfo.InvariantCulture).TrimStart('-'); |         return MyRegex2().Replace(me, "-$1").ToLower(CultureInfo.InvariantCulture).TrimStart('-'); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |     /// <summary> | ||||||
| @@ -501,25 +496,6 @@ public static class StringExtensions | |||||||
|         return $"<pre>{me}</pre>"; |         return $"<pre>{me}</pre>"; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |  | ||||||
|     ///     首字母小写 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ToLowerCamelCase(this string me) |  | ||||||
|     { |  | ||||||
|         return string.IsNullOrWhiteSpace(me) |  | ||||||
|             ? me |  | ||||||
|             : string.Concat( // |  | ||||||
|                 me[0].ToString(CultureInfo.InvariantCulture).ToLowerInvariant(), me.AsSpan(1)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |  | ||||||
|     ///     首字母大写 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ToUpperCamelCase(this string me) |  | ||||||
|     { |  | ||||||
|         return string.IsNullOrWhiteSpace(me) ? me : string.Concat(me[0].ToString().ToUpperInvariant(), me.AsSpan(1)); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     将连续多个空格替换成一个空格 |     ///     将连续多个空格替换成一个空格 | ||||||
|     /// </summary> |     /// </summary> | ||||||
| @@ -531,30 +507,10 @@ public static class StringExtensions | |||||||
|         return ret == me ? ret : ret.TrimSpaces(); |         return ret == me ? ret : ret.TrimSpaces(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// <summary> |  | ||||||
|     ///     将\ux0000 、 %u0000 、 &#x0000;  编码转换成可读字符串 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string UnicodeDe(this string me) |  | ||||||
|     { |  | ||||||
|         const string replacement = "&#x$1;"; |  | ||||||
|         if (me.Contains(@"\u")) { |  | ||||||
|             return Regexes.RegexBacksLantUnicode.Replace(me, replacement).HtmlDe(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // ReSharper disable once ConvertIfStatementToReturnStatement |  | ||||||
|         #pragma warning disable IDE0046 |  | ||||||
|         if (me.Contains("%u")) { |  | ||||||
|             #pragma warning restore IDE0046 |  | ||||||
|             return Regexes.RegexPercentUnicode.Replace(me, replacement).HtmlDe(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         return me.HtmlDe(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     url编码 |     ///     url编码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <returns>url编码后的字符串</returns> |     /// <returns>url编码后的字符串</returns> | ||||||
|     public static string Url(this string me) |     public static string Url(this string me) | ||||||
|     { |     { | ||||||
| @@ -564,7 +520,7 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     解码url编码 |     ///     解码url编码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">url编码后的字符串</param> | ||||||
|     /// <returns>解码后的原始字符串</returns> |     /// <returns>解码后的原始字符串</returns> | ||||||
|     public static string UrlDe(this string me) |     public static string UrlDe(this string me) | ||||||
|     { |     { | ||||||
| @@ -574,18 +530,24 @@ public static class StringExtensions | |||||||
|     /// <summary> |     /// <summary> | ||||||
|     ///     MD5 hmac编码 |     ///     MD5 hmac编码 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|     /// <param name="me">me</param> |     /// <param name="me">字符串</param> | ||||||
|     /// <param name="key">密钥</param> |     /// <param name="key">密钥</param> | ||||||
|     /// <param name="e">字符串使用的编码</param> |     /// <param name="e">字符串使用的编码</param> | ||||||
|     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> |     /// <returns>hash摘要的16进制文本形式(无连字符小写)</returns> | ||||||
|     private static string Md5Hmac(this string me, string key, Encoding e) |     private static string Md5Hmac(this string me, string key, Encoding e) | ||||||
|     { |     { | ||||||
|         #pragma warning disable CA5351 |  | ||||||
|         using var md5Hmac = new HMACMD5(e.GetBytes(key)); |         using var md5Hmac = new HMACMD5(e.GetBytes(key)); | ||||||
|         #pragma warning restore CA5351 |  | ||||||
|         return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me))) |         return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me))) | ||||||
|                            .Replace("-", string.Empty) |                            .Replace("-", string.Empty) | ||||||
|                            .ToLower(CultureInfo.CurrentCulture); |                            .ToLower(CultureInfo.CurrentCulture); | ||||||
|     } |     } | ||||||
| } | 
 | ||||||
| #pragma warning restore CodeLinesAnalyzer |     [GeneratedRegex("^(\\d{3})\\d{4}(\\d{4})$")] | ||||||
|  |     private static partial Regex MyRegex(); | ||||||
|  | 
 | ||||||
|  |     [GeneratedRegex("<[^>]*>")]
 | ||||||
|  |     private static partial Regex MyRegex1(); | ||||||
|  | 
 | ||||||
|  |     [GeneratedRegex("([A-Z])")]
 | ||||||
|  |     private static partial Regex MyRegex2(); | ||||||
|  | } | ||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | global using System.ComponentModel; | ||||||
| global using System.Data; | global using System.Data; | ||||||
| global using System.Data.Common; | global using System.Data.Common; | ||||||
| global using System.Globalization; | global using System.Globalization; | ||||||
| @@ -1,9 +0,0 @@ | |||||||
| <Project Sdk="Microsoft.NET.Sdk"> |  | ||||||
|     <ItemGroup> |  | ||||||
|         <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0-preview-23424-02"/> |  | ||||||
|         <PackageReference Include="xunit" Version="2.5.2-pre.2"/> |  | ||||||
|     </ItemGroup> |  | ||||||
|     <ItemGroup> |  | ||||||
|         <ProjectReference Include="..\NSExt\NSExt.csproj"/> |  | ||||||
|     </ItemGroup> |  | ||||||
| </Project> |  | ||||||
| @@ -1,36 +0,0 @@ | |||||||
| namespace NSExt.Tests; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     测试用例 |  | ||||||
| /// </summary> |  | ||||||
| public class TestCase |  | ||||||
| { |  | ||||||
|     // private readonly ITestOutputHelper _testOutputHelper; |  | ||||||
|     // |  | ||||||
|     // public TestCase(ITestOutputHelper testOutputHelper) |  | ||||||
|     // { |  | ||||||
|     //     _testOutputHelper = testOutputHelper; |  | ||||||
|     // } |  | ||||||
|     // |  | ||||||
|     // public enum MyEnum1 |  | ||||||
|     // { |  | ||||||
|     //     [ResourceDescription<TestCase>(nameof(Description))] |  | ||||||
|     //     Online = 1 |  | ||||||
|     // |  | ||||||
|     //   , Offline = 2 |  | ||||||
|     // } |  | ||||||
|     // |  | ||||||
|     // public static string Description { get; set; } = "123"; |  | ||||||
|     // |  | ||||||
|     // /// <summary> |  | ||||||
|     // ///     Case1 |  | ||||||
|     // /// </summary> |  | ||||||
|     // [Fact] |  | ||||||
|     // public void Case1() |  | ||||||
|     // { |  | ||||||
|     //     var test = MyEnum1.Online.ResDesc<TestCase>(); |  | ||||||
|     // |  | ||||||
|     //     _testOutputHelper.WriteLine(test); |  | ||||||
|     //     Assert.True(test is not null); |  | ||||||
|     // } |  | ||||||
| } |  | ||||||
							
								
								
									
										17
									
								
								src/NSExt.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/NSExt.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | <Project Sdk="Microsoft.NET.Sdk"> | ||||||
|  |  | ||||||
|  |     <PropertyGroup> | ||||||
|  |         <TargetFrameworks>net7.0</TargetFrameworks> | ||||||
|  |         <GenerateDocumentationFile>true</GenerateDocumentationFile> | ||||||
|  |     </PropertyGroup> | ||||||
|  |  | ||||||
|  |     <ItemGroup> | ||||||
|  |         <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0"/> | ||||||
|  |         <PackageReference Include="MinVer" Version="4.3.0-beta.1"> | ||||||
|  |             <PrivateAssets>all</PrivateAssets> | ||||||
|  |             <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  |         </PackageReference> | ||||||
|  |     </ItemGroup> | ||||||
|  |  | ||||||
|  |     <Import Project="../CodeQuality.props"/> | ||||||
|  | </Project> | ||||||
| @@ -1,24 +0,0 @@ | |||||||
| namespace NSExt.Attributes; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     指定本地化资源类型 |  | ||||||
| /// </summary> |  | ||||||
| [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Field)] |  | ||||||
| public sealed 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; } |  | ||||||
| } |  | ||||||
| @@ -1,26 +0,0 @@ | |||||||
| namespace NSExt.Attributes; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     本地化资源描述特性 |  | ||||||
| /// </summary> |  | ||||||
| [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Field)] |  | ||||||
| public sealed class ResourceDescriptionAttribute<T> : Attribute |  | ||||||
| { |  | ||||||
|     /// <summary> |  | ||||||
|     ///     Initializes a new instance of the <see cref="ResourceDescriptionAttribute{T}" /> class. |  | ||||||
|     /// </summary> |  | ||||||
|     public ResourceDescriptionAttribute(string resourceName) |  | ||||||
|     { |  | ||||||
|         ResourceName = resourceName; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     资源名称 |  | ||||||
|     /// </summary> |  | ||||||
|     public string ResourceName { get; set; } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     资源对象 |  | ||||||
|     /// </summary> |  | ||||||
|     public T ResourceObject { get; set; } |  | ||||||
| } |  | ||||||
| @@ -1,21 +0,0 @@ | |||||||
| namespace NSExt.Constant; |  | ||||||
| #pragma warning disable SYSLIB1045 |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     使用 RegexGenerator 新特性会生成重复key值的xmlComment导致出错 |  | ||||||
| /// </summary> |  | ||||||
| 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); |  | ||||||
| } |  | ||||||
| @@ -1,36 +0,0 @@ | |||||||
| namespace NSExt.Extensions; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     DbCommandExtensions |  | ||||||
| /// </summary> |  | ||||||
| public static class DbCommandExtensions |  | ||||||
| { |  | ||||||
|     /// <summary> |  | ||||||
|     ///     格式化参数拼接成完整的SQL语句 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ParameterFormat(this DbCommand me) |  | ||||||
|     { |  | ||||||
|         var sql = me.CommandText; |  | ||||||
|  |  | ||||||
|         // 应逆向替换,否则由于 多个表的过滤器问题导致替换不完整  如 @TenantId1  @TenantId10 |  | ||||||
|         for (var i = me.Parameters.Count - 1; i >= 0; i--) { |  | ||||||
|             #pragma warning disable IDE0072 |  | ||||||
|             sql = me.Parameters[i].DbType switch { |  | ||||||
|                       #pragma warning restore IDE0072 |  | ||||||
|                       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.AnsiString or DbType.StringFixedLength => sql.Replace( // |  | ||||||
|                               me.Parameters[i].ParameterName, "'" + me.Parameters[i].Value + "'") |  | ||||||
|                     , DbType.Boolean => sql.Replace( // |  | ||||||
|                           me.Parameters[i].ParameterName |  | ||||||
|                         , me.Parameters[i].Value != DBNull.Value && |  | ||||||
|                           Convert.ToBoolean(me.Parameters[i].Value, CultureInfo.InvariantCulture) |  | ||||||
|                               ? "1" |  | ||||||
|                               : "0") |  | ||||||
|                     , _ => sql.Replace(me.Parameters[i].ParameterName, me.Parameters[i].Value?.ToString()) |  | ||||||
|                   }; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return sql; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,41 +0,0 @@ | |||||||
| using System.ComponentModel.DataAnnotations; |  | ||||||
| using System.Reflection; |  | ||||||
| using NSExt.Attributes; |  | ||||||
|  |  | ||||||
| namespace NSExt.Extensions; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     EnumExtensions |  | ||||||
| /// </summary> |  | ||||||
| public static class EnumExtensions |  | ||||||
| { |  | ||||||
|     /// <summary> |  | ||||||
|     ///     获取显示特性 |  | ||||||
|     /// </summary> |  | ||||||
|     public static DisplayAttribute GetDisplay(this Enum me) |  | ||||||
|     { |  | ||||||
|         return me.GetAttributeOfType<DisplayAttribute>(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     获取枚举的本地化资源描述 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ResDesc<T>(this Enum e) |  | ||||||
|     { |  | ||||||
|         var typeOfEnum  = e.GetType(); |  | ||||||
|         var typeOfField = typeOfEnum.GetField(Enum.GetName(typeOfEnum, e)!); |  | ||||||
|         var resDescAttr = typeOfField!.GetCustomAttribute<ResourceDescriptionAttribute<T>>(true); |  | ||||||
|         return resDescAttr is null |  | ||||||
|             ? Enum.GetName(typeOfEnum, e) |  | ||||||
|             : typeof(T).GetProperty(resDescAttr.ResourceName)?.GetValue(default) as string; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     通过类泛型类型获取特性 |  | ||||||
|     /// </summary> |  | ||||||
|     private static T GetAttributeOfType<T>(this Enum me) |  | ||||||
|         where T : Attribute |  | ||||||
|     { |  | ||||||
|         return me.GetType().GetMember(me.ToString())[0].GetCustomAttributes<T>(false).FirstOrDefault(); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,83 +0,0 @@ | |||||||
| // ReSharper disable TemplateIsNotCompileTimeConstantProblem |  | ||||||
|  |  | ||||||
| namespace NSExt.Extensions; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     LoggerExtensions |  | ||||||
| /// </summary> |  | ||||||
| public static class LoggerExtensions |  | ||||||
| { |  | ||||||
|     private const string _MESSAGE_S_THREAD_ID_CALLER_NAME_CALLER_FILE_PATH_CALLER_LINE_NUMBER |  | ||||||
|         = "{Message} <s:{CallerName}@{CallerFilePath}:{CallerLineNumber}>"; |  | ||||||
|  |  | ||||||
|     private static readonly Action<ILogger, string, string, string, string, Exception> _logDebug |  | ||||||
|         = LoggerMessage.Define<string, string, string, string>(LogLevel.Debug, default |  | ||||||
|                                                              , _MESSAGE_S_THREAD_ID_CALLER_NAME_CALLER_FILE_PATH_CALLER_LINE_NUMBER); |  | ||||||
|  |  | ||||||
|     private static readonly Action<ILogger, string, string, string, string, Exception> _logError |  | ||||||
|         = LoggerMessage.Define<string, string, string, string>(LogLevel.Error, default |  | ||||||
|                                                              , _MESSAGE_S_THREAD_ID_CALLER_NAME_CALLER_FILE_PATH_CALLER_LINE_NUMBER); |  | ||||||
|  |  | ||||||
|     private static readonly Action<ILogger, string, string, string, string, Exception> _logFatal |  | ||||||
|         = LoggerMessage.Define<string, string, string, string>(LogLevel.Critical, default |  | ||||||
|                                                              , _MESSAGE_S_THREAD_ID_CALLER_NAME_CALLER_FILE_PATH_CALLER_LINE_NUMBER); |  | ||||||
|  |  | ||||||
|     private static readonly Action<ILogger, string, string, string, string, Exception> _logInfo |  | ||||||
|         = LoggerMessage.Define<string, string, string, string>(LogLevel.Information, default |  | ||||||
|                                                              , _MESSAGE_S_THREAD_ID_CALLER_NAME_CALLER_FILE_PATH_CALLER_LINE_NUMBER); |  | ||||||
|  |  | ||||||
|     private static readonly Action<ILogger, string, string, string, string, Exception> _logWarn |  | ||||||
|         = LoggerMessage.Define<string, string, string, string>(LogLevel.Warning, default |  | ||||||
|                                                              , _MESSAGE_S_THREAD_ID_CALLER_NAME_CALLER_FILE_PATH_CALLER_LINE_NUMBER); |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     Debug |  | ||||||
|     /// </summary> |  | ||||||
|     public static void Debug(this             ILogger me, object message, [CallerMemberName] string callerName = null |  | ||||||
|                            , [CallerFilePath] string callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) |  | ||||||
|     { |  | ||||||
|         _logDebug(me, message.ToString(), callerName, Path.GetFileName(callerFilePath) |  | ||||||
|             ,         callerLineNumber.ToString(CultureInfo.InvariantCulture), null); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     Error |  | ||||||
|     /// </summary> |  | ||||||
|     public static void Error(this             ILogger me, object message, [CallerMemberName] string callerName = null |  | ||||||
|                            , [CallerFilePath] string callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) |  | ||||||
|     { |  | ||||||
|         _logError(me, message.ToString(), callerName, Path.GetFileName(callerFilePath) |  | ||||||
|             ,         callerLineNumber.ToString(CultureInfo.InvariantCulture), null); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     Fatal |  | ||||||
|     /// </summary> |  | ||||||
|     public static void Fatal(this               ILogger me, object message, Exception ex = null |  | ||||||
|                            , [CallerMemberName] string  callerName = null, [CallerFilePath] string callerFilePath = null |  | ||||||
|                            , [CallerLineNumber] int     callerLineNumber = 0) |  | ||||||
|     { |  | ||||||
|         _logFatal(me, message.ToString(), callerName, Path.GetFileName(callerFilePath) |  | ||||||
|             ,         callerLineNumber.ToString(CultureInfo.InvariantCulture), ex); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     Info |  | ||||||
|     /// </summary> |  | ||||||
|     public static void Info(this             ILogger me, object message, [CallerMemberName] string callerName = null |  | ||||||
|                           , [CallerFilePath] string  callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) |  | ||||||
|     { |  | ||||||
|         _logInfo(me, message.ToString(), callerName, Path.GetFileName(callerFilePath) |  | ||||||
|            ,         callerLineNumber.ToString(CultureInfo.InvariantCulture), null); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     Warn |  | ||||||
|     /// </summary> |  | ||||||
|     public static void Warn(this             ILogger me, object message, [CallerMemberName] string callerName = null |  | ||||||
|                           , [CallerFilePath] string  callerFilePath = null, [CallerLineNumber] int callerLineNumber = 0) |  | ||||||
|     { |  | ||||||
|         _logWarn(me, message.ToString(), callerName, Path.GetFileName(callerFilePath) |  | ||||||
|            ,         callerLineNumber.ToString(CultureInfo.InvariantCulture), null); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,42 +0,0 @@ | |||||||
| namespace NSExt.Extensions; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     LongExtensions |  | ||||||
| /// </summary> |  | ||||||
| public static class LongExtensions |  | ||||||
| { |  | ||||||
|     /// <summary> |  | ||||||
|     ///     判断枚举是否包含某个位 |  | ||||||
|     /// </summary> |  | ||||||
|     public static bool HasFlag<T>(this long me, T flag) |  | ||||||
|         where T : Enum |  | ||||||
|     { |  | ||||||
|         var val = (long)(object)flag; |  | ||||||
|         return (me & val) == val; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     生成随机数 |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="me">me</param> |  | ||||||
|     public static long Rand(this long[] me) |  | ||||||
|     { |  | ||||||
|         return new Random(Guid.NewGuid().GetHashCode()).NextInt64(me[0], me[1]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     1970毫秒数转换成日期对象 |  | ||||||
|     /// </summary> |  | ||||||
|     public static DateTime Time(this long msFrom1970) |  | ||||||
|     { |  | ||||||
|         return DateTime.UnixEpoch.AddMilliseconds(msFrom1970).ToLocalTime(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     ToString 的 Invariant 版本 |  | ||||||
|     /// </summary> |  | ||||||
|     public static string ToInvString(this long me) |  | ||||||
|     { |  | ||||||
|         return me.ToString(CultureInfo.InvariantCulture); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,30 +0,0 @@ | |||||||
| using System.Text.Json; |  | ||||||
|  |  | ||||||
| namespace NSExt.Extensions; |  | ||||||
|  |  | ||||||
| /// <summary> |  | ||||||
| ///     ObjectExtensions |  | ||||||
| /// </summary> |  | ||||||
| public static class ObjectExtensions |  | ||||||
| { |  | ||||||
|     /// <summary> |  | ||||||
|     ///     将一个对象序列化成json文本 |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="me">me</param> |  | ||||||
|     /// <returns>json文本</returns> |  | ||||||
|     public static string Json(this object me) |  | ||||||
|     { |  | ||||||
|         return JsonSerializer.Serialize(me); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /// <summary> |  | ||||||
|     ///     将一个对象序列化成json文本 |  | ||||||
|     /// </summary> |  | ||||||
|     /// <param name="me">me</param> |  | ||||||
|     /// <param name="options">序列化选项</param> |  | ||||||
|     /// <returns>json文本</returns> |  | ||||||
|     public static string Json(this object me, JsonSerializerOptions options) |  | ||||||
|     { |  | ||||||
|         return JsonSerializer.Serialize(me, options); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| <Project Sdk="Microsoft.NET.Sdk"> |  | ||||||
|     <Import Project="../../code.quality.props"/> |  | ||||||
|     <Import Project="../../packable.props"/> |  | ||||||
|     <ItemGroup> |  | ||||||
|         <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0-rc.1.23419.4"/> |  | ||||||
|     </ItemGroup> |  | ||||||
|     <ItemGroup> |  | ||||||
|         <None Include="../../logo.png" Pack="true" PackagePath=""/> |  | ||||||
|     </ItemGroup> |  | ||||||
| </Project> |  | ||||||
| @@ -1,20 +0,0 @@ | |||||||
| using System.Text.RegularExpressions; |  | ||||||
|  |  | ||||||
| var slnFile = Directory.GetFiles(@"./", "*.sln").First(); |  | ||||||
| var content = File.ReadAllText(slnFile); |  | ||||||
|  |  | ||||||
| content = Regex.Replace( |  | ||||||
|     content, |  | ||||||
|     "Project\\(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\"\\) = \"meta\", \"meta\", \"{5198A03D-0CAC-4828-A807-34A693F73859}\"(?:.|\n)*?EndProject", |  | ||||||
|     $$""" |  | ||||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{5198A03D-0CAC-4828-A807-34A693F73859}" |  | ||||||
| {{'\t'}}ProjectSection(SolutionItems) = preProject |  | ||||||
| {{string.Join('\n', |  | ||||||
|              Directory.GetFiles(@"./", "*").Where(x => !x.EndsWith(".sln") && !x.EndsWith(".user")) |  | ||||||
|                       .Select(x=>$"\t\t{Path.GetFileName(x)} = {Path.GetFileName(x)}") |  | ||||||
|                       )}} |  | ||||||
| {{'\t'}}EndProject |  | ||||||
| """ |  | ||||||
| ); |  | ||||||
| Console.WriteLine(content); |  | ||||||
| File.WriteAllText(slnFile, content); |  | ||||||
		Reference in New Issue
	
	Block a user