派生类强制将属性写入initializecomponent
本文关键字:initializecomponent 属性 派生 | 更新日期: 2023-09-27 18:30:04
我有一个基类和一个派生类(如下所述),还有一个属性"TestProperty"。我的目标是让我在testproperty中设置的值在initializecomponent中序列化。这是非常关键的,因为稍后,我需要基类在设计时访问此属性的新值,除非在initializecomponent中设置了该值,否则我将无法访问这个新的"默认值"(但是,我认为defaultvalue属性在这种情况下不相关)。
在下面的情况下,让我的属性序列化的唯一方法是在设计器中打开"派生",并手动将属性设置为新值。
我担心定制的codedomserializer将成为解决方案,但我正在努力避免这种情况。我希望"基地"有尽可能少的代码。
我如何让我的属性(在代码中设置在我可以从哪里获得它的地方)通过从设计器编辑它而被阻塞到初始化组件中?
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";
}
}
关于我为什么要做我正在做的事情的更多信息。
我的问题是,当我在设计器中打开"派生"时,我有一个自定义的编辑器控件,用于编辑一些属性,称为"editableproperty"。在这种情况下,EditableProperty需要访问TestProperty。在运行时,这没有问题,我可以完全访问Derived类型,这也没有问题。
问题是,我使用的EditorControl位于不同的程序集中,并且它(无论出于何种原因,我认为它位于与派生程序不同的程序集中)没有加载我在派生的构造函数中设置的新值。
基本上,当我在设计器中打开派生并尝试使用自定义编辑器时,它会得到"在基类中设置"作为TestProperty的值。我需要在initializecomponent中设置TestProperty,以便我的编辑器控件能够看到值。
表单设计器没有创建Derived的实例;它正在创建Base的实例,然后从Derived调用InitializeComponent方法。这就是为什么您正在设置的属性的新值不会被设计器获取的原因。
您所要做的就是在Derived的设计器中设置属性的值,而不是在构造函数中设置它。这将在InitializeComponent中保留属性的新值,并使其在设计时可见。