替换方法的所有用法(介绍间接)

时间:2009-05-13 10:35:16

标签: c# refactoring resharper

我一般不太喜欢重构工具。无需深入细节。不过,我偶尔也会试用新版本。这是我在评估resharper 4.5时试图做的事情:

我需要用包装器方法(要创建)替换方法的所有用法,但我不能。我常常注意到一个明显的特征,是这种情况吗?如果resharper没有此功能,你知道这些工具吗?

编辑2:示例已得到改进,包括实例方法调用。 编辑: 这是一个简单的案例。

    static void Main(string[] args)
    {
        while(true)
        {
            if (Console.ReadKey().Key == ConsoleKey.Escape)
            {
                Thread.Sleep(10);
                if (Quiting()) break;
            }
            Console.Beep(250, 50);
        }
    }

    static bool Quiting()
    {
        if (Console.In.Peek() > 0)
        {
            Console.Beep(250, 150);
            return false;
        }
        return true;
    }

我需要的是:(编辑2:添加实例样本)

    private static StringBuilder _builder = new StringBuilder();

    static void Main(string[] args)
    {
        while(true)
        {
            var key = Console.ReadKey();
            if (key.Key == ConsoleKey.Escape)
            {
                Thread.Sleep(10);
                if (Quiting()) break;
            }
            _builder.Append(" (").Append(key.KeyChar).Append(") ");
            Beep(250, 50);
        }
    }

    static bool Quiting()
    {
        if (Console.In.Peek() > 0)
        {
            Beep(250, 150);
            _builder.Append('@');
            return false;
        }
        return true;
    }

    static void Beep(int frequency, int duration)
    {
        // finally cursor ends up here
        Console.Beep(250, 50);
    }

Console.Beep调用被重构。接下来让重构StringBuilder.Append(char):

class Program
{
    private static StringBuilder _builder = new StringBuilder();

    static void Main(string[] args)
    {
        while(true)
        {
            var key = Console.ReadKey();
            if (key.Key == ConsoleKey.Escape)
            {
                Thread.Sleep(10);
                if (Quiting()) break;
            }
            _builder.Append(" (").AppendUpper(key.KeyChar).Append(") ");
            Beep(250, 50);
        }
    }

    static bool Quiting()
    {
        if (Console.In.Peek() > 0)
        {
            Beep(250, 150);
            _builder.AppendUpper('n');
            return false;
        }
        return true;
    }

    static void Beep(int frequency, int duration)
    {
        // finally cursor ends up here
        Console.Beep(250, 50);
    }
}

static class StringBuilderExtensions
{
    public static StringBuilder AppendUpper(this StringBuilder builder, char c)
    {
        return builder.Append(char.ToUpper(c));
    }
}

从用法中选择并且可能省略常用参数(例如上面的250)或非扩展静力学的常见实例参数将使该特征更有价值。希望这能解决问题。

4 个答案:

答案 0 :(得分:5)

ReSharper没有将其作为单个重构。我可以这样做:

  1. 选择要包装的方法的内容,并使用Extract Method从内容中创建新的私有方法。
  2. 原始方法现在是“自身”的一个微不足道的包装器。如果你愿意,可以重命名它,或者按照自己的意愿操纵它(让它变为静态,移动到另一个类,用try / catch包围,等等)。

  3. 修改 根据您的编辑,您似乎还有其他问题。 Console.Beep不仅不在相同的类中,它甚至不在你的类中。

    但如果您不介意进行一些搜索和替换,那么您可以将它放入您自己的类中,然后继续进行重构:

    namespace Temporary {
        public class Console {
            public static void Beep(int x, int y) {System.Console.Beep(x,y);}
        }
    }
    

    然后执行“替换文件”以使用Temporary.Console.Beep替换Console.Beep,并按上述步骤操作。

答案 1 :(得分:4)

它没有包含在任何.NET重构IIRC中,具有这种重构的工具是Eclipse,但不适用于.NET / C#

答案 2 :(得分:3)

假设包装器方法将在同一个类中,您可以将当前方法重命名为新包装器方法的名称(Resharper中的ctrl + R + R)。这将在解决方案中重命名对此方法的所有调用。然后手动重命名原始方法(不要使用Resharper或者所有调用也会重命名)并添加包装器方法。


根据您的编辑,我认为您将从我见过的任何Visual Studio加载项中获得您想要的功能是不幸的(除了简单的查找和替换之外,它将为您提供一些方法我想)。

根据您愿意投入多少时间和精力,我想可以使用DXCore框架并编写一个可以进行这种重构的插件。

答案 3 :(得分:0)

Resharper具有Search and Replace with Pattern功能。它可以搜索和替换模式和表达式。

这会将对Console.Beep()的所有调用重构为您自己的方法。如果250是第一个参数,它只替换用法:

Reaplace call to Console.Beep()

但是,这将取代您自己的Beep方法中Console.Beep()的使用。您必须手动替换一次使用。