我可以使默认的集合编辑器和/或自定义UI编辑器调用属性的set访问器吗?

时间:2009-07-30 21:20:58

标签: c# serialization xml-serialization propertygrid uitypeeditor

我正在为一个应用程序编写一个插件,我有一个自定义类,它定义了程序的本机对象。 API允许我直接在本机文件中的对象上读取和写入键控字符串。而不是读取和写入我正在阅读的每个属性的Get和Set访问器中的私有字段,并将这些用户字符串写入程序中的本机对象。

用户通过PropertyGrid控件访问这些属性。到目前为止,除了现在我需要存储自定义对象类型( Floor )的自定义集合( FloorCollection )之外,这一切都能正常运行。

所以我使用 XmlSerializer 设置了一个属性。 GET访问器从本机对象读取用户字符串,然后将该字符串反序列化为FloorCollection的实例。 SET访问器通过读入 FloorCollection 的实例并将其序列化为用户字符串来反向执行。

这是我的财产的样子:

public FloorCollection Floors
{
    get 
    {
        string oldString = this.GetBaseObjUserString("CPFloors");
        if (oldString == null) return null;

        XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection));
        StringReader strReader = new StringReader(oldString);

        FloorCollection newCollection =                 
        (FloorCollection)serializer.Deserialize(strReader);
        return newCollection;
    }

    set 
    {
        FloorCollection newCol = value;

        if (newCol == null) return;

        //serializes new collection
        XmlSerializer serializer = new XmlSerializer(typeof(FloorCollection));
        StringWriter sw = new StringWriter();

        serializer.Serialize(sw, newCol);

        string newString = sw.ToString();

        this.SetBaseObjUserString("CPFloors", newString);
    }
}

我可以通过默认集合编辑器中的 PropertGrid 打开此集合属性。但是,默认集合编辑器仅在GET访问器提供的引用处编辑集合,而不是调用SET访问器将其保存回对象。所以我可以在默认编辑器中编辑集合,但是当我关闭并重新打开编辑器时,集合将不会更改,因为从不调用SET访问器将集合序列化回原生对象中的用户字符串。

我可以修改默认的集合编辑器来调用属性的set访问器吗?如果我为该属性设置了自定义 UITypeEditor ,是否可以使用属性集访问器将其保存回属性?或者是否有其他方法强制访问集合属性的代码进行GET并按值设置属性而不是引用?

1 个答案:

答案 0 :(得分:0)

我不相信XML Serializer会为集合调用set访问器。相反,它只会调用它从get访问器检索的集合实例的Add方法。

我相信您需要让您的集合类型覆盖Add和Remove方法等,以修改集合,然后将修改后的集合序列化回用户属性。