【发布时间】:2021-11-16 06:42:25
【问题描述】:
我想将我的项目迁移到 .NET 6 和 C# 10。作为此迁移的一部分,我想使用 global using 指令。
Visual Studio 2022 是否有任何工具或帮助来执行“to global using 指令”重构?
【问题讨论】:
标签: c# visual-studio .net-6.0 c#-10.0
我想将我的项目迁移到 .NET 6 和 C# 10。作为此迁移的一部分,我想使用 global using 指令。
Visual Studio 2022 是否有任何工具或帮助来执行“to global using 指令”重构?
【问题讨论】:
标签: c# visual-studio .net-6.0 c#-10.0
使命名空间全局化应该在其他文件中呈现相应的不必要的使用。删除不必要的使用诊断允许您选择修复范围:
如果由于某种原因未显示诊断,您可以通过 .editorconfig 通过规则代码 (IDE0005) 启用它:
# IDE0005: Using directive is unnecessary.
dotnet_diagnostic.IDE0005.severity = suggestion
【讨论】:
我刚遇到同样的问题,写了一个简单的控制台应用程序来解决这个问题。
using System.Text;
if (args.Length == 0 || string.IsNullOrEmpty(args[0]))
throw new ArgumentException("You must specify directory");
var directoryForScan = args[0];
if (!Directory.Exists(directoryForScan))
{
throw new ArgumentException($"{directoryForScan} not exist");
}
var filesEnumeration = Directory.EnumerateFiles(directoryForScan, "*.cs", SearchOption.AllDirectories);
var directorySeparator = Path.DirectorySeparatorChar;
var usingSet = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);
foreach (var filePath in filesEnumeration.Where(it => !it.Contains($"{directorySeparator}bin{directorySeparator}")
&& !it.Contains($"{directorySeparator}obj{directorySeparator}")))
{
await ProcessUsingAsync(filePath, usingSet);
}
var resultFilePath = Path.Combine(directoryForScan,"GlobalUsings.cs");
await using var resultStream = new FileStream(resultFilePath, FileMode.Create, FileAccess.Write, FileShare.Write);
await using var writer = new StreamWriter(resultStream, Encoding.UTF8);
foreach (var item in usingSet)
{
Console.WriteLine(item);
await writer.WriteAsync("global ");
await writer.WriteLineAsync(item);
}
await resultStream.FlushAsync();
static async Task ProcessUsingAsync(string filePath, ISet<string> usingSet)
{
await using var fileStream = File.OpenRead(filePath);
using var reader = new StreamReader(fileStream);
string? currentLine;
do
{
currentLine = await reader.ReadLineAsync();
if (currentLine is not null
&& currentLine.StartsWith("using")
&& currentLine.EndsWith(";")
&& !currentLine.Contains(" static ")
&& !currentLine.Contains("="))
{
usingSet.Add(currentLine);
}
} while (currentLine != null);
}
【讨论】: