2015-09-24 28 views
0

我想創建一個羅斯林代碼修復,改變歸結如下代碼:Roslyn Code Fix可以在多個獨立呼叫站點上運行嗎?

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()方法必須保留現有案例並添加新案例。

是否有可能創建這樣的重構,以便我可以要求它一次性修復項目中的所有實例?這是一個可行的問題,以幫助我避免陷入死衚衕,如果有的話。

+1

一兩件事你可以做的是檢查每一個方法,請參閱如果它具有該屬性,並且該屬性確實存在:請參閱您是否已經有了Execute()方法。如果你這樣做,你可以添加案例;如果您不:您創建方法並添加案例。 –

回答

3

我會爲此使用分析器+代碼修復提供程序。

  1. 分析儀檢查SyntaxKind.Attribute樣的節點,如果屬性您CommandAttribute類型匹配報告的診斷。

  2. 代碼修復提供程序同時提供RegisterCodeFixesAsync以重構單個屬性和自定義FixAllProvider,這些屬性可以重構文檔/項目/解決方案中的所有屬性。

這樣VS並所有繁重的任務,你的代碼修復提供商自動獲取你感興趣的範圍內的所有屬性的列表。

相關問題