我一般不太喜欢重构工具。无需深入细节。不过,我偶尔也会试用新版本。这是我在评估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)或非扩展静力学的常见实例参数将使该特征更有价值。希望这能解决问题。
答案 0 :(得分:5)
ReSharper没有将其作为单个重构。我可以这样做:
修改强> 根据您的编辑,您似乎还有其他问题。 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是第一个参数,它只替换用法:
但是,这将取代您自己的Beep方法中Console.Beep()
的使用。您必须手动替换一次使用。