我可以让ReSharper在我的解决方案中找到以下问题
if (this.SomeEvent != null)
{
this.SomeEvent (this, EventArgs.Empty);
}
并将其替换为
EventHandler handler = this.SomeEvent;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
最好尽可能自动化?
答案 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)
)中反转比较并关闭“匹配类似结构”。我自己开始使用这个代码检查,它实际上是一个好主意!