Как отключить правило анализа кода для всех вызывающих метод

Учитывая эти два класса:

public class Abc
{
   public static void Method(string propertyName) { }
}

public class Def
{
   public int Prop { get; }

   public void Method2() { Abc.Method("Prop"); }
}

Как есть, правило Roslyn CA1507 (используйте nameof) будет срабатывать для Method2. Я не хочу этого, потому что эта строка используется для долгосрочной пользовательской сериализации и никогда не может измениться (если мы решим изменить имя Prop, мы не будем изменять эту строку). Я не хочу отключать правило на уровне сборки или даже на уровне класса. Также есть сотни абонентов, таких как Def, поэтому я хочу что-то, что не требует от меня каких-либо действий с вызывающими абонентами.

Есть ли какой-нибудь [ExcludeParameterFromCodeAnalysis], который я могу включить в параметр propertyName, чтобы исключить его из всего или некоторого анализа кода?

Вот концепция, которая, я надеюсь, существует, или ее вариант:

public class Abc
{
   public static void Method([SuppressMessageForCallers("CA1507")]string propertyName) { }
}

public class Def
{
   public int Prop { get; }

   public void Method2() { Abc.Method("Prop"); }
}

person William Thomas Waller    schedule 02.08.2018    source источник
comment
Если вы добавили новый const string Bob, для которого установлено значение "Prop", и используете его вместо этого, выдает ли это предупреждение?   -  person mjwills    schedule 02.08.2018
comment
Это решение (без предупреждения), но если есть решение, которое включает только изменение Abc, это идеально.   -  person William Thomas Waller    schedule 03.08.2018


Ответы (2)


Я полагаю, что это правило только запускает 1, когда имя вашего параметра paramName или propertyName 2. Итак, давайте изменим параметр:

public class Abc
{
   public static void Method(string propertySerializationName) { }
}

1 Даже если вы не знаете или не можете догадаться, какой конкретный анализатор реализует предупреждение, это похоже на поиск репозиторий roslyn-analyters для конкретного кода (CA1507) должен помочь вам найти их без слишком большого количества ложных срабатываний.

2 Как ни странно, он даже не запускается по параметру с именем parameterName.

person Damien_The_Unbeliever    schedule 02.08.2018
comment
Красивый. Я бился головой, пытаясь найти простое однострочное решение, и это на все 100%. - person William Thomas Waller; 03.08.2018

Ничего нельзя сделать с Abc.Method объявлением относительно этого предупреждения, потому что предупреждение относится не к методу (или даже к его вызову), а к самому литералу.

Это может показаться некрасивым, но это работает:

public class Abc
{
   public static void Method(string propertyName) { }
}

public class Def
{
   public int Prop { get; }

   public void Method2()
   {
#pragma warning disable CA1507 - use nameof
       Abc.Method("Prop");
#pragma warning restore CA1507 - use nameof
   }
}

Visual Studio предложит это в меню лампочки или отвертки в левом желобе.

person Paulo Morgado    schedule 02.08.2018
comment
Если я правильно понимаю OP, они просят что-то сделать с Method (или, по крайней мере, внутри Abc, возможно), чтобы любой новый код, который выглядит как Method2, не нуждался в делать что угодно, например, эти прагмы. - person Damien_The_Unbeliever; 02.08.2018