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

时间:2011-11-17 07:13:36

标签: c# resharper

我可以让ReSharper在我的解决方案中找到以下问题

if (this.SomeEvent != null)
{
    this.SomeEvent (this, EventArgs.Empty);
}

并将其替换为

EventHandler handler = this.SomeEvent;
if (handler != null)
{
    handler(this, EventArgs.Empty);
}

最好尽可能自动化?

2 个答案:

答案 0 :(得分:2)

如果您有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的{​​{1}}类型的表达式占位符,确保System.EventHandler 已选中

单击Or derived type,您应该会看到搜索模式的所有实例。单击树根部的复选框,然后单击“替换”将其全部替换。

答案 1 :(得分:0)

您可以使用custom paterns进行代码检查。在Visual Studio中,转到Options,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>

使用导入功能进行代码检查。你可以看看我做了什么,并通过实例学习。

这将在VS中提供resharper提示,并在模式发生的任何地方提供修复建议。您可以使用“立即查找”查找搜索模式的所有匹配项。

一个大的(可悲的)。固定模式也被认为是嫌疑人。正如我现在所看到的那样,修复此问题的唯一方法是使搜索模式不那么通用。


修改

我不喜欢我最后的评论,所以我试着对它做点什么。我改变了XML,现在它可以工作了。诀窍是在替换代码(if (null != eventHandler))中反转比较并关闭“匹配类似结构”。我自己开始使用这个代码检查,它实际上是一个好主意!