从属性setter填充时,C#Component collection属性未序列化

时间:2011-04-20 20:08:37

标签: c# collections components properties

我有一个C#组件,它有两个属性,Property1和Property2。 Property1是int类型的简单属性,Property2是List,其中T是自定义类。 Property2具有DesignerSerializationVisibility.Content属性集。

在Designtime设置Property1时,组件应生成已设置的自定义类的数量。这可以工作,但类没有序列化到Designer.cs文件。当我通过Visual Studio的标准集合编辑器添加自定义类时,该类被序列化为Designer.cs文件。

如何让Visual Studio将生成的类序列化为Designer.cs文件?

以下是我现在所拥有的一小部分样本:

public class TestComponent : Component
{
    private int _Count;
    public int Count
    {
        get { return _Count; }
        set 
        { 
            _Count = value;

            Columns.Clear();

            for (int i = 0; i < _Count; i++)
            {
                TestClass tClass = new TestClass();
                tClass.Description = "TestClass" + i.ToString();
                Columns.Add(tClass);
            }
        }
    }

    private List<TestClass> columns = new List<TestClass>();
    [EditorBrowsable(EditorBrowsableState.Never)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public List<TestClass> Columns 
    { 
            get { return columns; } 
    }
}

[ToolboxItem(false), DesignTimeVisible(false)]
public class TestClass : Component
{
    private string _Description;
    public string Description
    {
        get { return _Description; }
        set { _Description = value; }
    }
}

2 个答案:

答案 0 :(得分:2)

Columns属性没有setter。序列化程序将忽略此属性。改为:

private List<TestClass> columns = new List<TestClass>();
[EditorBrowsable(EditorBrowsableState.Never)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<TestClass> Columns 
{ 
        get { return columns; } 
        set { columns = value; }
}

答案 1 :(得分:1)

注意:答案由@urk_forever在他的问题正文中提供。我已将问题回滚到原始状态,并将更改复制为CW


更新:我已经找到了解决方案。我不得不添加这一行:

this.Container.Add(tClass); 让Designer序列化生成的类。我已更新以下代码以反映此更改。现在这些类被序列化为Designer.cs。

代码在for-loop [IAbstract]

中更改如下
for (int i = 0; i < _Count; i++)
{
    TestClass tClass = new TestClass();
    tClass.Description = "TestClass" + i.ToString();
    Columns.Add(tClass);
    this.Container.Add(tClass);   // <-- added
}