【问题标题】:Suppressing Code Analysis warning if custom attribute is present如果存在自定义属性,则抑制代码分析警告
【发布时间】:2017-06-05 06:53:40
【问题描述】:

我创建了一个自定义属性,当附加到一个方法时,会导致该方法被反射调用。但是,我收到代码分析警告,表明该方法没有上游调用者(它是私有的,因为我不希望有任何其他调用它)。

显然我可以很容易地抑制它,但它确实使代码文件变得混乱。对于具有此属性的任何方法,是否有任何方法可以自动抑制此警告?

例如:

public class ArbitraryClass
{
    [RunOnStartUp]
    private static void RunThisOnStartup()
    {
        // Do some important stuff that can only be done on startup.
    }
}

public static class Program
{
    public static void Main()
    {
        AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(assembly => assembly.GetTypes())
            .SelectMany(type => type.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic))
            .Where(method => method.GetCustomAttribute<RunOnStartupAttribute>() != null)
            .ToList()
            .ForEach(method => method.Invoke(null, new object[0]));

        // Start up the main form etc.
    }
}

(是的,我知道在这种情况下我可能只使用静态初始化程序,但“启动时”并不是我使用它的唯一情况)。

【问题讨论】:

  • this 看起来很有希望,但不是很舒服

标签: c# .net reflection code-analysis custom-attributes


【解决方案1】:

我知道这是旧的,但有些人可能仍然看到它。

很遗憾,您不能为所有具有该属性的方法自动抑制它。

你能做的最好的就是创建一个全局抑制,并针对每个方法,这至少可以清理混乱。

只需创建一个名为“GlobalSuppressions.cs”的文件,使用 System.Diagnostics.CodeAnalysis 命名空间,并为您的方法添加抑制警告,如下所示。 还应该注意,它不必存在于 GlobalSupressions.cs 中,它可以存在于任何类中,只要它在命名空间之前。

using System.Diagnostics.CodeAnalysis;


[assembly: SuppressMessage("Category", "CA1811", Scope = "member", Target = "~M:ArbitraryClass.RunThisOnStartup")]

这也可以通过按“Ctrl”+“.”自动创建,然后选择“抑制或配置问题”、“抑制(警告 ID)”,最后选择“在抑制文件中”。 我假设此功能在 5 年前不存在,因为原始发布者知道禁止显示警告。

【讨论】:

  • 我知道这件事,但这与我希望实现的目标截然相反。一方面,它可能不是我自己的代码——我正在考虑在库中包含一个属性供任何人使用,并希望自动抑制使用它的分析警告;要求添加特定的抑制违背了我的问题的目的。虽然这仍然是有用的信息或许多情况,但不幸的是不是我的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多