gpt4 book ai didi

c# - 属性不会序列化到 .designer.cs 文件中

转载 作者:行者123 更新时间:2023-11-30 13:52:08 25 4
gpt4 key购买 nike

在 VS2010 中,尽管使用了 ShouldSerializeFoo 方法,控件属性也不会被序列化,使用 DesignerSerializationVisibility.Visible/Content 也是如此。

代码如下:

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 函数处理的许多其他事情)无关。

DesignerSerializationVisibility.Content 对于 string(或任何其他不可变类型)没有多大意义。设计者可以将属性的序列化视为三种类型:

  • 无 - 它从不序列化有关该属性的任何内容
  • 可见 - 它将序列化属性的实际值
  • 内容 - 它将序列化属性值的属性值

默认情况下,属性被视为可见。我意识到我对 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 的一个实例),它应该序列化该值的属性值。

因此,回到您的问题,这就是为什么您不想为 string 属性使用 Content 的原因。因为 string 是不可变的,所以设计者无需序列化任何内容。将其标记为 Visible 或完全关闭该属性(因为这是默认设置)。

虽然可以向设计人员提供关于您是否要序列化特定属性的自定义指导,但这是一个非常复杂(且令人讨厌)的过程。不过,简单 方法是在属性上使用 DefaultValue 属性。如果属性是否应该被序列化可以通过将它的值与常量进行比较来确定(换句话说,它在运行时不依赖于任何其他东西,比如另一个属性的值),你可以像这样装饰属性:

[DefaultValue("foo")]
public string Foo { get; set; }

如果设计者随后发现 Foo 的值等于 "foo",那么它根本不会序列化该属性。

关于c# - 属性不会序列化到 .designer.cs 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com