【问题标题】:To global using directive refactoring到全局使用指令重构
【发布时间】: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


    【解决方案1】:

    我不认为,有任何工具可以进行"To global using" directive 重构,但您可以尝试其他方式,

    1. 在整个项目中用空字符串替换using块,可以使用Ctrl + Shift + H

    1. 现在您可以在任何.cs 文件中添加global using,或者将所有全局使用放在一个名为globalusings.cs 的单独文件中

    注意:

    • 查找 + 替换将在所有 .cs 文件中添加额外的空行。

    【讨论】:

      【解决方案2】:

      使命名空间全局化应该在其他文件中呈现相应的不必要的使用。删除不必要的使用诊断允许您选择修复范围:

      如果由于某种原因未显示诊断,您可以通过 .editorconfig 通过规则代码 (IDE0005) 启用它:

      # IDE0005: Using directive is unnecessary.
      dotnet_diagnostic.IDE0005.severity = suggestion
      

      【讨论】:

      • 很多谢谢,这是个好主意,但故事的一半,我的意思是我们必须手动创建全局使用。你是对的,然后使用指令删除清理(通过 editorconfig 内置的 VS 或第 3 方)将完成繁重的工作。
      【解决方案3】:

      我刚遇到同样的问题,写了一个简单的控制台应用程序来解决这个问题。

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-20
        • 1970-01-01
        相关资源
        最近更新 更多