在C#中禁用OBSOLETE错误

我正在使用Microsoft TFS API,其中一个接口上的某个属性已标记为已过时,它指示我使用其他属性。 不幸的是,API要我使用的属性由TFS2010而不是TFS2008使用。

我试过这样做:

#pragma warning disable 0612, 0618 request.CommandLineArguments = arguments; #pragma warning restore 0612, 0618 

但我仍然得到CommandLineArguments已经过时的错误。 反正有压制这个吗?

编辑

不幸的是,这并没有显示为“警告为错误”,实际上在我的项目中关闭了警告的错误。 以下是违规代码的屏幕上限以及错误列表

在此处输入图像描述

编辑2:

使用ILSpy后,CommandLineArguments属性在TFS2010 API中如下所示:

  [Obsolete("This property has been deprecated. Please remove all references. To pass command line arguments to MSBuild.exe, set the ProcessParameters property.", true)] string CommandLineArguments { get; set; } 

不幸的是,我认为没有办法告诉编译器忽略Obsolete属性导致的错误。

编辑3正如@Peter Ritchie指出的那样,这个值可以通过reflection来设定。 我想通过这个问题虽然我的猜测是,如果微软将属性设置为抛出exception,即使你通过reflection设置它,我怀疑该值会被引用到任何地方。

以下为我工作:

 #pragma warning disable 612,618 request.CommandLineArguments = arguments; #pragma warning restore 612,618 

注意数字中没有前导0

编辑:好的,你的程序集在ObsoleteAttribute构造函数中有“true”参数。 这意味着您无法使用该属性而不会出现错误。

如果您无法重新编写代码以避免使用此属性,则必须通过reflection调用属性setter,例如:

 request.GetType().GetProperty("Number").SetValue(request, arguments, null); 

和获得是相似的:

(string)request.GetType()。GetProperty(“CommandLineArguments”)。GetValue(request,null);

Visual Studio 2015

由于[已废弃]而构建失败?

仅当启用“将警告视为错误”并且存在具有[已废弃]属性的方法时,才会出现这种情况。

方法1:将错误降级为警告

.csproj文件中添加612,618 (对所有部分重复):

  true 4 612,618 true full false bin\Debug\ DEBUG;TRACE prompt  

如果处理许多.csproj files ,请参阅Appendix A: Notepad++ for search and replace

方法2:忽略文件中的错误

注意:建议不要使用此方法,因为它会隐藏标记为[已废弃]的方法的警告。 我们仍然希望看到所有对过时方法的调用列表,以便我们可以升级它们。

使用#pragma warning disable 612,618

方法3:忽略项目中的错误

注意:建议不要使用此方法,因为它会隐藏标记为[已废弃]的方法的警告。 我们仍然希望看到所有对过时方法的调用列表,以便我们可以升级它们。

编辑项目(对所有部分重复):

在此处输入图像描述

方法4:忽略项目中的错误

注意:建议不要使用此方法,因为它会隐藏标记为[已废弃]的方法的警告。 我们仍然希望看到所有对过时方法的调用列表,以便我们可以升级它们。

手动编辑.csproj以禁用特定错误的警告。 添加标签612,618 (对所有部分重复):

  612,618 true bin\x64\Debug\ DEBUG;TRACE true full x64 prompt  

附录A:用于搜索和替换的Notepad ++

有很多文件? 没问题!

在NotePad ++中打开所有.csproj文件,然后:

  • 查找: true
  • 替换: true\n\t612,618

在此处输入图像描述

以防万一其他人偶然发现这件事。

如果标记将属性设置为Obsolete的方法,并且DONT将其标记为true,则编译器会忽略内部错误而抛出更高级别的警告,而您可以忽略该警告。

IE

 [Obsolete("Cause it aint",false)] public void Foo() { request.CommandLineArguments = arguments; }