ReSharper自动搜索和替换事件使用模式
本文关键字:事件 模式 替换 搜索 ReSharper | 更新日期: 2023-09-27 18:15:01
我能让ReSharper在我的解决方案中找到以下问题吗
if (this.SomeEvent != null)
{
this.SomeEvent (this, EventArgs.Empty);
}
并替换为
EventHandler handler = this.SomeEvent;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
尽可能自动化?
如果您有r# 5或更高版本,您可以使用结构搜索和替换,可以在ReSharper | Find | Search with Pattern...
中找到。
在"搜索模式"中输入
if ($ev$ != null)
{
$ev$(this, EventArgs.Empty);
}
在替换模式中输入
EventHandler handler = $ev$;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
选择Add Placeholder | Expression
,创建一个名为ev
的类型为System.EventHandler
的表达式占位符,确保Or derived type
被选中。
单击Replace
,应该会显示搜索模式的所有实例。单击树的根处的复选框,然后单击Replace来替换它们。
您可以使用自定义模式进行代码检查。在Visual Studio中,选择选项,Resharper。在"代码检查"类别下找到"自定义模式"。在那里,你可以在许多内置的检查之上添加你自己的代码检查。
最简单的方法是将下一段文本保存到XML文件中:
<CustomPatterns>
<Pattern Severity="SUGGESTION" FormatAfterReplace="True" ShortenReferences="True" Language="CSHARP">
<Comment>Event call is not thread-safe</Comment>
<ReplaceComment>Convert to thread-safe event call</ReplaceComment>
<ReplacePattern><![CDATA[var eventHandler = $SomeEvent$;
if (null != eventHandler)
{
eventHandler($args$);
}
]]></ReplacePattern>
<SearchPattern><![CDATA[if ($SomeEvent$ != null)
{
$SomeEvent$ ($args$);
}
]]></SearchPattern>
<Params>
<IgnoreBracesInSingleStatementBlocks>False</IgnoreBracesInSingleStatementBlocks>
<IgnoreParanthesisInExpressions>False</IgnoreParanthesisInExpressions>
<SmartMatchAssociativeExpressions>False</SmartMatchAssociativeExpressions>
<TreatReversedBinaryExpressionsEquivalent>Never</TreatReversedBinaryExpressionsEquivalent>
</Params>
<Placeholders>
<ArgumentPlaceholder Name="args" Minimal="-1" Maximal="-1" />
<ExpressionPlaceholder Name="SomeEvent" ExpressionType="System.EventHandler" ExactType="False" />
</Placeholders>
</Pattern>
</CustomPatterns>
并使用import函数进行代码检查。你可以看到我做了什么,并以身作则。
这将在VS中给你一个更清晰的提示,并在模式发生的地方给出一个修复建议。你可以使用"Find now"来查找所有出现的搜索模式。
一个很大的BUT(可悲的)。固定模式也被认为是嫌疑犯。解决这个问题的唯一方法,正如我现在所看到的,是使搜索模式不那么通用。
编辑:
我不喜欢我最后的评论,所以我还是想做点什么。我修改了XML,现在它可以工作了。诀窍是在替换代码(
if (null != eventHandler)
)中反转比较并关闭"匹配相似结构"。我已经开始使用这个代码检查自己,这实际上是一个伟大的想法!