是否有可以将所有声明转换为完全限定类型的C#重构工具?

时间:2011-11-24 23:03:26

标签: c# .net types refactoring

这是需要做的事情。

让我们假设您拥有以下C#代码:

private Int32 DoSomething(Int32 number, String message) 
{
    StringBuilder stringBuilder = null;
    Regex regex = null;
    // code goes here
}

这需要成为:

private System.Int32 DoSomething(System.Int32 number, System.String message) 
{
    System.Text.StringBuilder stringBuilder = null;
    System.Text.RegularExpressions.Regex regex = null;

    // code goes here
}

我找到了相反的工具(例如ReSharper),但这些类型绝对需要完全合格,而不仅仅是一致。

6 个答案:

答案 0 :(得分:3)

您可以使用Microsoft Roslyn为此任务编写自己的工具。它允许您解析源代码并进行分析和修改。目前它是CTP版本,但它将完成工作。并且有足够的文档可以满足您的需求。很抱歉没有发布任何链接,我是用手机写的。

答案 1 :(得分:1)

我不确定这样的工具是否存在。

一种方法是删除所有使用,然后修复错误。在右键单击类型时可以获得的菜单选项可以添加using语句,也可以完全限定类型。

答案 2 :(得分:1)

这对罗斯林来说应该不会太难。您需要获取所有TypeSyntax个节点,然后向语义模型询问相应的ITypeSymbol,然后从符号中获取完全限定名称,最后用新{TypeSyntax节点替换TypeSyntax节点1}} node。

我写了一个quickfix,用尽可能短的具体类型替换var,您可能希望将其用作灵感:https://github.com/CodesInChaos/Roslyn/tree/master/Chaos.VarToConcrete

由于您想要替换所有出现,并且Roslyn-Visual-Studio还不太稳定,我会选择roslyn控制台应用程序而不是代码发布提供程序。

答案 3 :(得分:0)

不确定工具,但是嘿......

怎么样?

查找: Int32(以及您需要的每种类型)

替换为: System.Int32(等等)

不是最好的解决方案,但是使用小型项目比搜索工具花费的时间更少

答案 4 :(得分:0)

它可能对您没有帮助,但C#编译器生成的IL代码会自动执行此操作。

您的代码生成以下IL(如果您添加一行以在DoSomething中返回内容):

.method private hidebysig instance int32 
        DoSomething(int32 number,
                    string message) cil managed
{
  // Code size       11 (0xb)
  .maxstack  1
  .locals init ([0] class [mscorlib]System.Text.StringBuilder stringBuilder,
           [1] class [System]System.Text.RegularExpressions.Regex regex,
           [2] int32 CS$1$0000)
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  stloc.0
  IL_0003:  ldnull
  IL_0004:  stloc.1
  IL_0005:  ldc.i4.1
  IL_0006:  stloc.2
  IL_0007:  br.s       IL_0009
  IL_0009:  ldloc.2
  IL_000a:  ret
} // end of method Program::DoSomething

答案 5 :(得分:0)

为Visual Studio创建一个插件而不是更改所有引用,如何显示具有完全限定名称的叠加层(不仅仅是当鼠标在某个类型上时)?我认为这将需要更少的努力,并可能会增加一个真正的价值,这个编码标准实际上并没有。显然这不是你的想法,但大多数人会同意这肯定会让你的代码更难阅读。为你的上司提供一个很好的扩展,不仅可以帮助他查看你公司的代码,也可以帮助他人,也可以帮助你。

我可以看到其他人也想要这样的功能,但我无法想象每种类型的完全限定名称都会显示在任何地方。

如果安装了Visual Studio SDK,则会获得一个编辑器分类器模板,这可能是一个很好的起点(没有真正考虑过实现)。