我有一个标记为已过时的自定义视图
[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
通过将此属性添加到* .xaml.cs文件中。现在,我在编译时的 xaml.g.cs 文件中收到警告,因为它是局部类(由文件后面的* .xaml和* .xaml.cs代码组成)。>
我不明白为什么收到警告,该视图未在其他任何地方使用。是的,我可以删除该文件,但是出于好奇,他为什么不检查这是否是局部类?如何摆脱警告并同时保留Obsolete
属性?
编辑:
这是“完整”代码:
AccordionButton.xaml.cs
using MyProject.Common.CustomRenderers;
using System;
using Xamarin.Forms;
namespace MyProject.Views
{
#pragma warning disable 618
[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
public partial class AccordionButton : MultiLineButton
{
private bool expand = false;
public bool Expand
{
get{ return this.expand;}
set{ this.expand = value;}
}
public ContentView AssociatedContent { get; set; }
public AccordionButton()
{
}
}
#pragma warning restore 618
}
AccordionButton.xaml
<?xml version="1.0" encoding="utf-8" ?>
<customViews:MultiLineButton xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyProject.Views.AccordionButton"
xmlns:customViews="clr-namespace:MyProject.Views;assembly=MyProject">
</customViews:MultiLineButton>
AccordionButton.xaml.g.cs
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
[assembly: global::Xamarin.Forms.Xaml.XamlResourceIdAttribute("MyProject.Views.AccordionButton.xaml", "Views/AccordionButton.xaml", typeof(global::MyProject.Views.AccordionButton))]
namespace MyProject.Views {
[global::Xamarin.Forms.Xaml.XamlFilePathAttribute("Views\\AccordionButton.xaml")]
public partial class AccordionButton : global::MyProject.Views.MultiLineButton {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Forms.Build.Tasks.XamlG", "0.0.0.0")]
private void InitializeComponent() {
global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(AccordionButton));
}
}
}
如果我双击警告,他将标记此部分global::MyProject.Views.AccordionButton
。该警告仅在编译后出现...
当我将其与测试项目(一切正常)进行比较时, AccordionButton.xaml.g.cs 看起来像这样
[assembly: global::Xamarin.Forms.Xaml.XamlResourceIdAttribute("TestObsolete.Views.AccordionButton.xaml", "Views/AccordionButton.xaml", null)]
所以我的项目中有一些不同之处,但是我还没有弄清楚什么以及为什么。
答案 0 :(得分:1)
Obsolete attribute
将程序实体标记为不再建议使用。每次使用标记为过时的实体,都会根据属性的配置方式而产生警告或错误。
1。将过时的类设置为
[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
public partial class Page1 : ContentView
{
public Page1()
{
InitializeComponent();
Page2 page2 = new Page2();
page2.method();
}
}
2。在方法上设置过时。
[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.")]
public partial class Page1 : ContentView
{
public Page1()
{
InitializeComponent();
Page2 page2 = new Page2();
page2.method();
}
}
public partial class Page2
{
[Obsolete("AccordionButton is deprecated, please use HeaderButton instead.",true)]
public void method()
{
Console.Write("a");
}
}
使用IsError属性设置已过时。 IsError是一个布尔值,向编译器指示使用ObsoleteAttribute属性应该导致它发出错误(IsError为true)还是警告(IsError为false)。
如果您想在没有警告的情况下使用过时,可以尝试以下方法。
1。忽略文件错误
`#pragma warning disable 618`
Page2 page2 = new Page2();
page2.method1();
2。忽略项目中的错误
有关禁用警告的更多信息,可以检查链接。 https://stackoverflow.com/a/40525222/11850033
已更新:
感谢您的回复!您在这里写了一个不错的摘要。我尝试使用#pragma warning disable和#pragma warning restore,但应将其放置在什么位置以免收到警告?我将编辑问题,以便您查看。我仍然不明白的是为什么会发生此错误。 Xaml使用分部类(因此它正在使用自身),是否足以引起警告?
#pragma warning
可以启用或禁用某些警告。
用法:
#pragma warning disable warning-list
#pragma warning restore warning-list
warning-list
:
以逗号分隔的警告编号列表。 “ CS”前缀是可选的。
如果未指定警告编号,则禁用将禁用所有警告,而还原将启用所有警告。
根据您的代码,可以在使用如下所示的过时类之前将其放入。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
#pragma warning disable
AccordionButton accordionButton = new AccordionButton();
var s = accordionButton.Expand;
}
}
要清楚:当另一个View使用此组件(AccordionButton)时,应该引发警告。如果xaml和文件后面的代码“一起工作”,则不应该显示。
当另一个视图使用此类时,也会抛出该错误。