我有一个基类和一个派生类(如下所述),还有一个属性“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看到值。
答案 0 :(得分:1)
表单设计者没有创建Derived的实例;它正在创建Base的实例,然后从Derived调用InitializeComponent方法。这就是设计师不会选择您设置的属性的新值的原因。
您所要做的就是在Derived的设计器中设置属性的值,而不是在构造函数中设置它。这将在InitializeComponent中保留属性的新值,并使其在设计时可见。