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から開くことができます。ただし、デフォルトのコレクションエディターは、SETアクセサーを呼び出してオブジェクトに保存するのではなく、GETアクセサーによって提供された参照でのみコレクションを編集します。したがって、デフォルトのエディターでコレクションを編集できますが、エディターを閉じて再度開いても、SETアクセサーが呼び出されてコレクションがネイティブオブジェクトのユーザー文字列にシリアル化されることはないため、コレクションは変更されません。

プロパティのセットアクセサーを呼び出すようにデフォルトのコレクションエディターを変更できますか?プロパティのカスタムUITypeEditorを設定した場合、プロパティセットアクセサーを使用してプロパティに保存し直す方法はありますか?または、コレクションプロパティにアクセスしているコードに、参照ではなく値でプロパティをGETおよびSETするように強制する他の方法はありますか?

4

1 に答える 1

0

setXMLシリアライザーがコレクションのアクセサーを呼び出すことはないと思います。get代わりに、アクセサーから取得したコレクションインスタンスのAddメソッドを呼び出すだけです。

コレクションを変更するには、コレクションタイプでAddメソッドやRemoveメソッドなどをオーバーライドしてから、変更したコレクションをシリアル化してユーザープロパティに戻す必要があると思います。

于 2009-07-30T23:39:17.447 に答える