派生类强制将属性写入initializecomponent

时间:2012-04-04 14:24:18

标签: c# serialization windows-forms-designer codedom

我有一个基类和一个派生类(如下所述),还有一个属性“TestProperty”。我的目标是让我在testproperty中设置的值在intializecomponent中被序列化。这是非常关键的,因为稍后我需要基类在设计时访问此属性的新值,除非在intializecomponent中设置该值,否则我将无权访问此新属性,默认值“如果你很好(但是,我不认为defaultvalue属性在这种情况下是相关的)。

在下面的例子中,获取我的属性序列化的唯一方法是在设计器中打开“derived”并手动将属性设置为新值。

我担心自定义编码序列化器将成为解决方案,但我非常想避免这种情况。我希望“base”拥有尽可能少的代码。

我怎样才能获得我的属性(在代码中的任何地方设置),以便通过设计师编辑来阻塞初始化组件?

public partial class Base : Form
   {
      public Base()
      {
         InitializeComponent();
         TestProperty = "set in the base class";
      }
      [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
      public string TestProperty
      {
         get;
         set;
      }
   }

一个简单的派生类

public partial class Derived : Base
   {
      public Derived()
      {
         InitializeComponent();
         this.TestProperty = "i want to be packed into initializecomponent somehow";
      }
   }

有关我为什么要做我正在做的事情的更多信息。

我的问题是,当我在设计器中“派生”打开时,我有一个自定义编辑器控件bieng用于编辑一些属性,称为“editableproperty”。在这种情况下,EditableProperty需要访问TestProperty。在运行时,没问题,我可以完全访问Derived作为一个类型,而且没问题。

问题是我正在使用的EditorControl是在一个不同的程序集中,并且它(无论出于何种原因,我认为它因为它在一个不同的程序集中而不是派生),不会加载我设置的新值。衍生的构造词。

基本上,当我在设计器中打开派生并尝试使用自定义编辑器时,它将“在基类中设置”作为TestProperty的值。我需要在initializecomponent中设置TestProperty,以便我的editorcontrol看到值。

1 个答案:

答案 0 :(得分:1)

表单设计者没有创建Derived的实例;它正在创建Base的实例,然后从Derived调用InitializeComponent方法。这就是设计师不会选择您设置的属性的新值的原因。

您所要做的就是在Derived的设计器中设置属性的值,而不是在构造函数中设置它。这将在InitializeComponent中保留属性的新值,并使其在设计时可见。