什么函数(是)调用Control.ShouldSerialize Visible

时间:2010-04-20 15:16:31

标签: c# .net winforms

有谁知道从哪里调用Control.ShouldSerializeVisible?反射器没有显示它被任何东西使用,谷歌出现了空白。

3 个答案:

答案 0 :(得分:2)

私有ShouldSerializeXxx()方法是[DefaultValue]属性的替代方法。由于默认值可能取决于无法在DefaultValueAttribute构造函数中表达的状态或需要复杂表达式,因此无法始终使用该属性。

该方法通过Reflection执行,它通过PropertyDescriptor.ShouldSerializeValue()方法公开。此管道的重要客户端是PropertyGrid控件(用于选择粗体字体)和Windows窗体设计时代码序列化程序(使用它来抑制不必要的代码)。

答案 1 :(得分:1)

序列化使用反射来访问属性,这可以解释为什么它不显示Reflector的任何用法。

此属性告诉序列化过程Visible属性已从其默认值更改,并应序列化。

答案 2 :(得分:0)

这是设计器和序列化器实现使用的基于约定的模式。例如,在ComponentModel

        PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["Visible"];
        if (prop.ShouldSerializeValue(obj))
        {   // write it...

        }
如果存在,

将调用该方法。同样,这个ShouldSerializeValue抽象也是使PropertyGrid中某些属性显示为粗体的原因(注意:它还会查看[DefaultValue]之类的内容。) / p>

PropertyDescriptor是在绑定和设计师方面谈论任意属性的原始方式)

同样,一些序列化程序(当然XmlSerializer,但我相信DataContractSerializer - 和protobuf-net)会尊重这种模式,询问对象是否要将该属性序列化。