如何使代码约定忽略特定的程序集引用?

Cro*_*ono 27 .net c# code-contracts visual-studio

我正在对Visual Studio进行扩展.在代码中,我使用代码约定来进行断言和检查.我将警告选项级别设置为高.

我想要做的是保持警告级别,同时忽略对EnvDTE引用进行的任何检查.

请考虑以下代码示例:

public static string GetAbsoluteOutputFolder(EnvDTE.Project project)
{
    if (project == null) throw new ArgumentNullException("project");

    var path =
        project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString();
    //...
}
Run Code Online (Sandbox Code Playgroud)

使用我当前的设置,CC会要求我在分配path变量之前添加以下检查:

Contract.Assume(project.ConfigurationManager != null);
Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null);
Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);
Run Code Online (Sandbox Code Playgroud)

因此,我想在这里做的是告诉CC"信任"EnvDTE并忽略这些类型及其属性.

我认为"乐观外部API"CC选项就是为了这个目的而服务的.事实证明它没有.

有没有办法让它按照我想要的方式运行,不需要较低的警告级别

编辑:我想要一个在项目级别工作的解决方案,并且仍然允许执行"常规"检查.

Mec*_*eli 4

Can\xc2\xb4t 提供详细的解决方案,但这应该可以通过在程序集级别使用基线功能或 System.Diagnostics.CodeAnalysis.SuppressMessage 来解决:

\n\n
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", "Whatever")]\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以使用 SuppressMessageAttribute 的“Target”属性仅忽略特定类型/方法/命名空间上的消息:

\n\n
[SuppressMessage("Microsoft.Contracts", \n                 "CC1055", \n                 Scope="Member", \n                 Target="YouNamespace.EnvDTE.Project")]\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我使用的参数只是一个不错的选择,您\xc2\xb4ll 必须自己找出正确的范围、MessageId 和目标:) 在旁注中,我认为该属性是有条件的(“CODE_ANALYSIS”)。

\n\n

官方建议的解决方案是创建某种包装器,在您的情况下可能是一个将创建或包含 EnvDTE.Project 对象的存储库。然后您可以在其中添加所需的 Contract.Ensures 。

\n