デフォルトのコレクションエディターやカスタムUIエディターでプロパティのsetアクセサーを呼び出すことはできますか?
-
06-07-2019 - |
質問
プログラムのネイティブオブジェクトの属性を指定するカスタムクラスがあるアプリケーション用のプラグインを書いています。 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およびSETすることを強制する他の方法はありますか?
解決
XML Serializerがコレクションの set
アクセサーを呼び出すとは思わない。代わりに、 get
アクセサーから取得するコレクションインスタンスのAddメソッドを呼び出すだけです。
コレクションを変更するには、コレクションタイプでAddメソッドやRemoveメソッドなどをオーバーライドし、変更したコレクションをユーザープロパティにシリアル化する必要があると思います。