【问题标题】:Can a Roslyn Code Fix operate on multiple independent call sites?Roslyn 代码修复可以在多个独立的呼叫站点上运行吗?
【发布时间】:2015-09-24 18:44:15
【问题描述】:

我想创建一个 Roslyn 代码修复程序来更改属性代码,例如:

public class CommandHandler
{
    [Command("Cmd1")]
    public void Foo()
    {
        // do something
    }

    [Command("Cmd2")]
    public void Bar()
    {
        // do something
    }
}

到这里:

public class CommandHandler
{
    public void Foo()
    {
        // do something
    }

    public void Bar()
    {
        // do something
    }

    public void Execute(string command)
    {
        switch(command)
        {
            case "Cmd1":
                Foo();
                break;
            case "Cmd2":
                Bar();
                break;
        }
    }
}

主要要求是:

  • 重构的签名是任何带有[Command] 属性的方法。
  • 一个类中可以有多个这样的方法。
  • 合成的Execute() 方法必须保留现有案例并添加新案例。

是否可以创建这样的重构,以便我可以要求它一次性修复项目中的所有实例?这是一个可行性问题,以帮助我避免陷入死胡同,如果有的话。

【问题讨论】:

  • 你可以做的一件事是检查每个方法,看看它是否有属性,如果有:看看你是否已经有一个Execute() 方法。如果这样做,则添加案例;如果你不这样做:你创建方法并添加案例。

标签: c# visual-studio refactoring roslyn


【解决方案1】:

我会为此使用分析器 + 代码修复提供程序。

  1. 分析器检查 SyntaxKind.Attribute 类型的节点,如果属性与您的 CommandAttribute 类型匹配,则报告诊断。

  2. 代码修复提供程序提供 RegisterCodeFixesAsync 来重构单个属性和自定义 FixAllProvider 可以重构文档/项目/解决方案中的所有属性。

这样 VS 会完成所有繁重的工作,并且您的代码修复提供程序会自动获取您感兴趣的范围内所有属性的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2015-03-06
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多