如果自定义属性存在,则禁止代码分析警告

时间:2017-01-20 10:11:34

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

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

显然我可以轻松地压制它,但它会使代码文件混乱。有没有办法让任何具有此属性的方法自动抑制此警告?

例如:

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.
    }
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

using System.Diagnostics.CodeAnalysis;


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

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