作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在对 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();
//...
}
根据我当前的设置,CC 会要求我在分配 path
变量之前添加以下检查:
Contract.Assume(project.ConfigurationManager != null);
Contract.Assume(project.ConfigurationManager.ActiveConfiguration != null);
Contract.Assume(project.ConfigurationManager.ActiveConfiguration.Properties != null);
因此我想在这里做的是告诉 CC“信任”EnvDTE 并忽略这些类型及其属性。
我认为“对外部 API 持乐观态度”CC 选项正是为了这个目的;事实证明它没有。
有没有办法让它按照我想要的方式运行不需要较低的警告级别?
编辑:我想要一个可以在项目级别工作并且仍然允许执行“常规”检查的解决方案。
最佳答案
无法提供详细的解决方案,但这应该可以通过在程序集级别使用基线功能或 System.Diagnostics.CodeAnalysis.SuppressMessage 来解决:
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Contracts", "Whatever")]
您可以使用 SuppressMessageAttribute 的“目标”属性来仅忽略特定类型/方法/命名空间上的消息:
[SuppressMessage("Microsoft.Contracts",
"CC1055",
Scope="Member",
Target="YouNamespace.EnvDTE.Project")]
请注意,我使用的参数只是一个不错的选择,您必须自己找出正确的范围、MessageId 和目标 :) 在旁注中,我认为属性是有条件的(“CODE_ANALYSIS”)。
针对此问题的官方建议解决方案是创建某种包装器,在您的情况下可能是一个将创建或包含您的 EnvDTE.Project 对象的存储库。然后您可以在此处添加所需的 Contract.Ensures。
关于c# - 如何让代码契约忽略特定的程序集引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25568707/
我是一名优秀的程序员,十分优秀!