属性不会被序列化到.designer.cs文件中
在VS2010中,尽管具有DesignerSerializationVisibility.Visible / Content的ShouldSerializeFoo方法,控件属性也不会被序列化。
这是代码:
class Class1 : UserControl { [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public string Foo { get; set; } public bool ShouldSerializeFoo() { return true; } public Class1() { Foo = "dupa"; } }
但是,设计器不会为此属性生成任何内容:
// // class11 // this.class11.Location = new System.Drawing.Point(224, 262); this.class11.Name = "class11"; this.class11.Size = new System.Drawing.Size(150, 150); this.class11.TabIndex = 2; this.class11.Load += new System.EventHandler(this.class11_Load);
你正在混合序列化方案。 设计器序列化( DesignerSerializationVisibility
的用途)与实例序列化机制无关(这是ShouldSerializeXXX
在许多其他方面的function处理)。
DesignerSerializationVisibility.Content
对string
(或任何其他不可变类型)没有多大意义。 设计人员可以将属性的序列化视为三种类型:
默认情况下,属性被视为Visible
。 我意识到我对Content
定义可能有点令人困惑。 我的意思是这样的:
public class MyControl : Control { public class SomeOptions { public string Option1 { get; set; } public string Option2 { get; set; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public SomeOptions Options { get; private set; } public string Foo { get; set; } }
现在,当这个类由设计器序列化时,它看起来像这样:
// myControl1 this.myControl1.Foo = "value"; this.myControl1.Options.Option1 = "option1"; this.myControl1.Options.Option2 = "option2";
这应该更有意义; 将属性标记为Content
表示,而不是序列化属性的实际值 (在这种情况下,它将是SomeOptions
的实例),它应该序列化该值的属性值。
所以,回到你的问题,这就是为什么你不希望Content
为string
属性。 因为string
s是不可变的,所以设计器没有任何序列化。 将其标记为Visible
或完全保留属性(因为这是默认值)。
虽然可以向设计者提供关于是否要序列化特定属性的自定义方向,但这是一个非常复杂(和讨厌)的过程。 但是, 简单的方法是在属性上使用DefaultValue
属性。 如果属性是否应该序列化可以通过将其值与常量进行比较来确定(换句话说,它不依赖于运行时的任何其他内容,如另一个属性的值),您可以像这样装饰属性:
[DefaultValue("foo")] public string Foo { get; set; }
如果设计者然后看到Foo
的值等于"foo"
,那么它根本不会序列化该属性。
上述就是C#学习教程:属性不会被序列化到.designer.cs文件中分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/998396.html