在C#中禁用OBSOLETE错误

dpa*_*ons 13 c#

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

我试过这样做:

#pragma warning disable 0612, 0618
            request.CommandLineArguments = arguments;
#pragma warning restore 0612, 0618
Run Code Online (Sandbox Code Playgroud)

但我仍然得到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;
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*hie 14

以下为我工作:

#pragma warning disable 612,618
            request.CommandLineArguments = arguments;
#pragma warning restore 612,618
Run Code Online (Sandbox Code Playgroud)

注意数字中没有前导0

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

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

request.GetType().GetProperty("Number").SetValue(request, arguments, null);
Run Code Online (Sandbox Code Playgroud)

和获得是相似的:

(string)request.GetType().GetProperty("CommandLineArguments").GetValue(request,null);


Con*_*ngo 13

Visual Studio 2015

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

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

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

添加<WarningsNotAsErrors>612,618</WarningsNotAsErrors>了在.csproj文件(重复所有部分):

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <WarningLevel>4</WarningLevel>
    <WarningsNotAsErrors>612,618</WarningsNotAsErrors>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用 #pragma warning disable 612,618

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

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

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

在此输入图像描述

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

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

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

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
    <NoWarn>612,618</NoWarn>
    <DebugSymbols>true</DebugSymbols>
    <OutputPath>bin\x64\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
    <DebugType>full</DebugType>
    <PlatformTarget>x64</PlatformTarget>
    <ErrorReport>prompt</ErrorReport>        
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

有很多文件?没问题!

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

  • 找: <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
  • 更换: <TreatWarningsAsErrors>true</TreatWarningsAsErrors>\n\t<WarningsNotAsErrors>612,618</WarningsNotAsErrors>

在此输入图像描述


Dav*_*vid 7

以防万一其他人偶然发现了这一点。

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

IE

[Obsolete("Cause it aint",false)]
public void Foo(object arguments)
{
     request.CommandLineArguments = arguments;
} 
Run Code Online (Sandbox Code Playgroud)

  • 我知道这有点黑客攻击,但是当设置“error:true”时有什么方法可以忽略吗? (3认同)