我正在为一个应用程序编写一个插件,我有一个自定义类,它定义了程序的本机对象。 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并按值设置属性而不是引用?
答案 0 :(得分:0)
我不相信XML Serializer会为集合调用set
访问器。相反,它只会调用它从get
访问器检索的集合实例的Add方法。
我相信您需要让您的集合类型覆盖Add和Remove方法等,以修改集合,然后将修改后的集合序列化回用户属性。