【问题标题】:Resharper find pattern and replace - how to insert stringsResharper 查找模式和替换 - 如何插入字符串
【发布时间】:2012-12-31 13:39:45
【问题描述】:

我们有一个健全性检查方法

void IsNotNull<T>(T obj){...}

调用

IsNotNull(obj); 

我想替换它来调用另一个重载,该重载需要第二个字符串类型的参数(消息)

void IsNotNull<T>(T obj, string message){...}

所以我想将调用更改为

IsNotNull(obj, "obj is null");

我正在尝试使用 resharper 的查找模式和替换来实现此目的。

所以我的查找模式是:IsNotNull($args$) - 这工作正常,它会找到方法调用

替换模式:IsNotNull($args$, "$args$ is null") - 这没有任何作用

我也试过这个IsNotNull($args$, """" + $args$ + """")

--已编辑-- 显示正确措辞的建议框(对于参数和标识符),但一旦应用它就不同了。我正在使用 Resharper 6

应用建议后,我得到了这个

当我点击编辑图案

【问题讨论】:

  • 您使用的是什么 R#?我已经尝试过@hmemcpy 提出的版本,一切都很好。 R# 7.1

标签: c# refactoring resharper automated-refactoring


【解决方案1】:

您在搜索和替换中定义的$args$ 参数是什么?如果你把它设为Identifier,那么你替换应该可以工作:

查找:IsNotNull($args$) - 其中$args$Identifier
替换:IsNotNull($args$, "$args$ is null")

你应该得到你想要的结果,即IsNotNull(obj, "obj is null")

【讨论】:

  • 谢谢,不幸的是它没有解决它仍然打印 IsNotNull(obj, obj) 的问题。我希望我的第二个参数用双引号括起来
  • “其中 $args$ 是标识符”是重要的部分。
【解决方案2】:

您可以考虑尝试使用这种模式:

IsNotNull($args$, string.Format("{0} is null", $args$))

ReSharper 7.1 非常适合我。

看起来,R# 通常不想在字符串文字内评估参数表达式。鉴于你的模式

IsNotNull($args$, "$args$ is null")

它用 IsNotNull(5, 5); 替换了 IsNotNull(5);,这很奇怪

【讨论】:

  • 在这种情况下,我需要 args 的名称,而不是 args 的值作为 args.ToString()。我基本上需要用双引号将我的参数括起来
  • 我明白了,很抱歉造成误解,因为我曾经跟踪参数值,而不是参数的名称。我会尝试看看是否可以修改解决方案以满足您的需求
【解决方案3】:

最简单的方法是像这样重写原始方法:

void IsNotNull<T>(T obj){
    IsNotNull(obj, "obj is null");
}

然后点击方法签名,选择Refactor->Inline Method (Ctrl+R, Ctrl+I)。如果您需要保留原始方法签名,可以,也可以选中“删除内联方法声明”复选框。

编辑:看起来 hmemcpy 的解决方案适用于 7.1,所以我建议升级。但是,如果这不可行,请在 Visual Studio 中尝试以下正则表达式查找和替换。

Find: IsNotNull\(([^\),]+)\);
Replace: IsNotNull($1, "$1 is null");

确保选中“使用正则表达式”,并且“查找范围:”应该是“整个解决方案”。

【讨论】:

  • 感谢您的回复,但您的建议在 Resharper-Replacement-Pattern 或一般情况下无法解决我的问题。我想要显示特定的消息。不只是'obj is null',在我的问题中它只是一个例子
  • @NasmiSabeer:没问题。实际上,只是想通了,正在更新我的解决方案。
  • @NasmiSabeer:实际上,看起来 hmemcpy 的解决方案是正确的。关键是 $args$ 必须在 Search With Pattern 对话框中定义为标识符,而不是参数。我不确定为什么他们对 Argument 占位符有引号限制,但 Identifier 占位符似乎工作得很好。
  • 你能举个例子说明它不能用吗?你使用的是什么版本的 Resharper?它似乎在我的系统上正常工作。
  • 谢谢。如果您点击“编辑模式”链接,您能显示会出现什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2014-08-03
  • 2011-08-22
  • 2020-08-20
相关资源
最近更新 更多