ReSharper автоматический поиск и замена шаблона для использования события - PullRequest
2 голосов
/ 17 ноября 2011

Могу ли я заставить ReSharper найти следующую проблему в моем решении

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

и замените его на

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

желательно максимально автоматизировать?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Если у вас 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, и вам должны быть показаны все экземпляры шаблона поиска. Установите флажок в корне дерева и нажмите «Заменить», чтобы заменить их все.

0 голосов
/ 17 ноября 2011

Вы можете использовать пользовательские паттерны для проверки кода.В Visual Studio зайдите в Настройки, РешарперВ категории «Проверка кода» найдите «Пользовательские шаблоны».Там вы можете добавить свои собственные вставки кода поверх многих встроенных проверок.

Самый простой способ получить то, что вам нужно, это сохранить следующий фрагмент текста в 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 и предложит исправление, где бы ни происходил паттерн.Вы можете использовать «Найти сейчас», чтобы найти все вхождения шаблона поиска.

Одно большое НО (к сожалению).Фиксированный шаблон также распознается как подозреваемыйЕдинственный способ исправить это, насколько я могу видеть сейчас, это сделать шаблон поиска менее универсальным.


Редактировать:

Я не сделалМне не понравился мой последний комментарий, поэтому я все-таки попытался что-то с этим сделать.Я изменил XML, и теперь он работает.Хитрость заключалась в том, чтобы отменить сравнение в коде замены (if (null != eventHandler)) и отключить «сопоставлять аналогичные конструкции».Я сам начал использовать эту проверку кода, на самом деле это была отличная идея!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...