3

ユーザーが変更を保存せずにウィンドウを閉じる (または他のアクションを実行する) 場合、メッセージ ボックスで通知される機能を実行する必要があります。

これを行うには、ウィンドウを開いてから問題のオブジェクトに変更が加えられたかどうかを知る必要があります。

これを行う方法は、ウィンドウがロードされたときにオブジェクトのコピーを作成し、それを保持し_original、ウィンドウが閉じる前に、変更されているかどうかに関係なくオブジェクトと比較できるようにすることだと考えています。

_originalメモリ内の同じ場所への参照を両方とも持たずに、オブジェクトを にコピーする最良の方法は何ですか?

また、後で2つのオブジェクトを比較して、オブジェクトが異なるかどうかを確認する最良の方法は何_originalですか?

4

5 に答える 5

4

BinaryFormatterを使用してオブジェクトをシリアル化し、逆シリアル化することができます。

public static string Serialize<T>(T instance)
{
    var formatter = new BinaryFormatter();
    using (var stream = new MemoryStream())
    {
        formatter.Serialize(stream, instance);
        return Convert.ToBase64String(stream.ToArray());
    }
}

public static T Deserialize<T>(string serialized)
{
    var formatter = new BinaryFormatter();
    using (var stream = new MemoryStream(Convert.FromBase64String(serialized)))
    {
        return (T)formatter.Deserialize(stream);
    }
}
于 2012-07-25T14:53:12.830 に答える
3

modified状態を維持する方法でオブジェクトを実装できます。

public class StatefulObject
{
    private string _propertyOne;

    public StatefulObject()
    {
        this.Modified = false;
    }

    public string PropertyOne
    {
        get { return this._propertyOne; }
        set
        {
            if (this._propertyOne != value)
            {
                this._propertyOne = value;
                this.Modified = true;
            }
        }
    }

    public bool Modified { get; private set; }
}

これには、オブジェクトを初期化するタイミングを決定するなどの追加の作業が必要になりますが (コンストラクターのみに制限しない限り)、アイデアは得られます。

于 2012-07-25T14:55:29.633 に答える
1

浅いコピーを行う簡単な方法としてICloneableを実装します (オブジェクトがそれほど複雑ではないと仮定します)。次に、それらが異なるか、または単に異なるかを確認する方法に応じて、IComparableまたはIEquatableを使用できます。

より良い回答が必要な場合は、もう少し具体的にする必要があります。

于 2012-07-25T14:55:42.363 に答える
0

オブジェクトを比較することは最善の解決策ではないと思います。ウィンドウ自体を観察することをお勧めします。ウィンドウ ロジックでプロパティを使用する場合は、NotifyPropertyChanged が最適です。

http://www.dreamincode.net/forums/topic/208833-using-the-inotifypropertychanged-functionality/

于 2012-07-25T14:55:37.433 に答える
0

やり過ぎかもしれませんが、私はicloneableicomparableを実装します。オブジェクトが単純なメンバーごとのクローンである場合のコピーの作成に関しては、常にオプションです。オブジェクトがネストされた udt の場合は、idom を単純な型まで継続する必要がありますが、単体テストではこれが何らかの方法で役立つことがわかりました。

于 2012-07-25T14:57:35.777 に答える