【问题标题】:Can I make the default collection editor and/or a custom UIEditor envoke the set accessor for a property?我可以让默认集合编辑器和/或自定义 UI 编辑器调用属性的 set 访问器吗?
【发布时间】:2009-07-30 21:20:57
【问题描述】:

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

【问题讨论】:

    标签: c# serialization xml-serialization propertygrid uitypeeditor


    【解决方案1】:

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

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

    【讨论】:

    • 胡?你把它弄反了。 set 访问器是序列化发生的地方,就像 get 访问器是反序列化发生的地方一样。问题是当我使用默认集合编辑器或自定义 UITypeEditor 通过 PropertyGrid 编辑集合时,引用集合被直接编辑,而不是通过我的 SET 访问器传回,它将序列化新值。
    • 不,我知道了。因为永远不会调用 set 访问器,所以您将需要一个特殊的集合,该集合将在集合更改时进行序列化。
    • 嗯,集合真的不需要知道什么时候被序列化。相反,具有集合的类需要知道集合何时更改,以便重新序列化它。我的自定义集合继承自 BindingList 所以它确实有一个我可以订阅的 listchanged 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多