1

我正在为一个应用程序编写一个插件,其中我有一个自定义类,该类赋予程序的本机对象。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,是否可以使用属性集访问器将其保存回该属性?或者是否有其他方法可以强制访问集合属性的代码通过值而不是引用来获取和设置属性?

4

1 回答 1

0

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

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

于 2009-07-30T23:39:17.447 回答