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);
}

尽可能自动化?

ReSharper自动搜索和替换事件使用模式

如果您有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))中反转比较并关闭"匹配相似结构"。我已经开始使用这个代码检查自己,这实际上是一个伟大的想法!