是否有任何工具允许我将所有C#内置类型更改为它们的.NET Framework类型

本文关键字:NET 类型 Framework 置类型 允许我 工具 任何 内置 是否 | 更新日期: 2023-09-27 18:27:15

我发现很难保持一致的一件事是使用intInt32以及boolBoolean等等。

我发现通过突出显示大小写和颜色语法来识别所有类型更简单。。。

List<int>

List<Int32>

后者更清洁并保持一致性。很多代码中都有这两者,我正在寻找一个重构工具来改变它们。

是否有任何工具允许我将所有C#内置类型更改为它们的.NET Framework类型?

是否有任何工具允许我将所有C#内置类型更改为它们的.NET Framework类型

如果您查看StyleCop,规则SA1121实际上强制执行与您想要的相反的内容(要求您将Int32更改为int)。反编译该规则并创建自己的StyleCop规则来强制执行相反的规则是相当琐碎的。

这不是自动的,但在完成初始转换后,您可以将其合并到构建中,然后将任何新用途标记为错误。

使用Roslyn CTP,以下内容在实践中似乎有效:

static SyntaxTree UpdatePredefinedTypes(this SyntaxTree tree)
{
    PredefinedTypeSyntax node;
    var root = tree.Root;
    while (null != (node = root.DescendentNodes()
                               .OfType<PredefinedTypeSyntax>()
                               .FirstOrDefault(
                                 syn => redefineMap.ContainsKey(syn.PlainName))))
    {
        var ident = Syntax.IdentifierName(redefineMap[node.PlainName]);
        root = root.ReplaceNode<SyntaxNode, SyntaxNode>(
            node, 
            ident.WithLeadingTrivia(node.GetLeadingTrivia())
                 .WithTrailingTrivia(node.GetTrailingTrivia()));
    }
    return SyntaxTree.Create(
        tree.FileName,
        (CompilationUnitSyntax)root,
        tree.Options);
}

当使用正确的redefineMap(例如{"int","Int32"}{"double","Double"})时,以下程序被成功转换:

using System;
namespace HelloWorld {
    class Program {
        static void Main(string[] args) {
            int x = Int32.Parse("11");
            double y = x;
            Console.WriteLine("Hello, World! {0}", y);
        }
     }
}

输出:

using System;
namespace HelloWorld {
    class Program {
        static void Main(String[] args) {
            Int32 x = Int32.Parse("11");
            Double y = x;
            Console.WriteLine("Hello, World! {0}", y);
        }
     }
}

编译时:

var mscorlib = new AssemblyFileReference(
    typeof(object).Assembly.Location);
var newTree = UpdatePredefinedTypes(tree);
var compilation = Compilation.Create("HelloWorld")
                             .AddReferences(mscorlib)
                             .AddSyntaxTrees(new[] { newTree });
var results = compilation.Emit(File.Create("helloworld.exe"));
Console.WriteLine("Success: {0}", results.Success);
foreach (var message in results.Diagnostics)
{
    Console.WriteLine("{0}", message);
}
// C:'tmp'cs>roslyn-test.exe
// Success: True
// 
// C:'tmp'cs>dir /b *.exe
// roslyn-test.exe
// helloworld.exe
//
// C:'tmp'cs>helloworld.exe
// Hello, World! 11
//

您甚至可以利用Workspace功能来更新整个解决方案:

var workspace = Workspace.LoadSolution(info.FullName);
var solution = workspace.CurrentSolution;
foreach (var project in solution.Projects
    .Where(prj => prj.LanguageServices.Language == "C#"))
{
    foreach (var doc in project.Documents
        .Where(d => d.SourceCodeKind == SourceCodeKind.Regular
                 && d.LanguageServices.Language == "C#"))
    {
        var tree = SyntaxTree.ParseCompilationUnit(
            doc.GetText(),
            doc.DisplayName);
        var newTree = UpdatePredefinedTypes(tree);
        solution = solution.UpdateDocument(doc.Id, newTree.Text);
    }
}
workspace.ApplyChanges(workspace.CurrentSolution, solution);
// when running this in VS on itself it correctly updates the project!

除了VS的搜索和替换功能,我不知道任何工具。

当我调用静态成员时,我通常使用c#别名进行类型声明,并使用.NET类型

int i = Int32.Parse(s);

这只是个人喜好。

我最终写了一个宏来完成这个

Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics
Public Module ReplaceCSharpBuiltInTypesWithTheirFrameworkTypes
    Sub ReplaceCSharpBuiltInTypesWithTheirFrameworkTypes()
        Dim dictionary As New Collections.Generic.Dictionary(Of String, String)
        dictionary.Add("bool", "Boolean")
        dictionary.Add("byte", "Byte")
        dictionary.Add("sbyte", "SByte")
        dictionary.Add("char", "Char")
        dictionary.Add("decimal", "Decimal")
        dictionary.Add("double", "Double")
        dictionary.Add("float", "Single")
        dictionary.Add("int", "Int32")
        dictionary.Add("uint", "UInt32")
        dictionary.Add("long", "Int64")
        dictionary.Add("ulong", "UInt64")
        dictionary.Add("object", "Object")
        dictionary.Add("short", "Int16")
        dictionary.Add("ushort", "UInt16")
        dictionary.Add("string", "String")
        For Each key In dictionary.Keys
            DTE.Find.FindWhat = key
            DTE.Find.ReplaceWith = dictionary(key)
            DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
            DTE.Find.MatchCase = True
            DTE.Find.MatchWholeWord = True
            DTE.Find.MatchInHiddenText = False
            DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxLiteral
            DTE.Find.ResultsLocation = vsFindResultsLocation.vsFindResultsNone
            DTE.Find.Action = vsFindAction.vsFindActionReplaceAll
            DTE.Find.Execute()
        Next
    End Sub
End Module