为非常量类型的属性设置DefaultValue?

时间:2009-05-01 09:05:52

标签: .net properties windows-forms-designer

我有一个Windows.Forms组件,它具有一个返回Size结构的“mySize”属性。 我的目的是让这个属性根据组件的大小自动计算返回的mySize,除非mySize已被明确设置,在这种情况下,返回mySize的设置值。 不幸的是,现在我将组件嵌入到表单中,Windows窗体设计器决定开始为mySize属性显式生成和设置一个值,这让我很沮丧。

所以我需要设置一个DefaultValue,这样设计师就会离开而不管我。

我已经阅读了处理System.ComponentModel.DefaultValue的答案,所以我知道我必须在构造函数中手动设置属性的值,但我发现的答案和文档只涉及设置DefaultValue假,常数。

一个Size结构不是一个常量,所以VB编译器吓坏了,告诉我我不能将Size设置为Type Size属性的DefaultValue,因为Sizes不是常量。

这让我的大脑受伤了。

我可以通过使用getMySize和setMySize方法而不是使用属性来解决问题,但我想知道是否有任何方法可以为Size设置默认属性。

注意:我没有使用mySize作为某种疯狂的尝试来覆盖Size属性(其DefaultValue为150x150,因此SOMETHING似乎能够为Sizes设置DefaultValues); mySize只是Class所需的一些Size值。

2 个答案:

答案 0 :(得分:5)

不要应用DefaultValue属性,而是编写以下两种方法:

bool ShouldSerializemySize() { ... }
void ResetmySize() { ... }

在ShouldSerializemySize中,如果值应序列化为代码,则返回true。在ResetmySize中,将属性重置为其默认值。

组件设计师将通过反射自动获取这些方法。

更多信息: http://msdn.microsoft.com/en-us/library/53b8022e(VS.71).aspx

答案 1 :(得分:0)

我注意到实际上有一个特定的例子,用于在DefaultValue's MSDN page的社区内容部分设置一个类型为Size的defaultValue,建议使用this page中描述的DefaultValue构造函数。

不幸的是,虽然那里给出的例子是正确的,但它起作用,在我看来,MSDN文档自然不会引导任何人得到这个答案。

我要把albahari的答案设定为这个问题的答案(因为他的回答至少有点意义)并且为了完整性而在这里留下这个例子。