如何为方法的所有调用者禁用代码分析规则

时间:2018-08-02 00:18:33

标签: c# roslyn

给出这两个类:

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

public class Def
{
   public int Prop { get; }

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

按原样,将为Method2触发Roslyn规则CA1507(使用nameof)。我不希望那样,因为该字符串用于长期的自定义序列化,并且永远无法更改(如果我们决定更改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"); }
}

2 个答案:

答案 0 :(得分:3)

我相信,当您的参数名称为paramNamepropertyName 2 时,此规则仅triggers 1 。因此,让我们更改参数:

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

1 即使您不知道或无法猜测哪个特定的分析器实施了警告,看起来也像在roslyn-analyzers存储库中搜索特定的代码(CA1507 )应该可以帮助您找到没有太多误报的邮件。

2 很奇怪,它甚至似乎都没有在名为parameterName的参数上触发。

答案 1 :(得分:0)

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将在左侧装订线的灯泡或螺丝刀菜单上提供该功能。