5

少し調べてみましたが、特定の変数に別の変数への参照を格納する方法が見つかりません。ユーザーが行ったことを元に戻すクラスを作成しようとしています。

class UndoAction
{
    public object var;
    public object val;
    public UndoAction(ref object var, object val)
    {
        this.var = var;
        this.val = val;
    }

    public static List<UndoAction> history = new List<UndoAction>();
    public static void AddHistory(ref object var, object val)
    {
        history.Add(new UndoAction(ref var, val));
    }
}

ここで私が達成しようとしていることを見ることができると思います。

私が実行した問題。

this.var = var;

参照は保存しませんが、参照された「var」の値を保存します。簡単に実行できるように、参照自体を保存するにはどうすればよいですか。

this.var = val;

私の場合、アクションを「元に戻す」には?

4

2 に答える 2

13

標準のセーフC#はこれをまったくサポートしていません。基盤となるフレームワークには、必要な概念のほとんどすべてが含まれていますが、C#言語では公開されていません。しかし、それでも、そのような参照をフィールドに格納することはできません。

あなたが持つことができる最善のことは、デリゲートを使用するいくつかのクラスでそれをラップすることです。これは明らかに比較するとかなり高価ですが、タイトなループで物事を変更しない限り、これで十分かもしれません。

class VarRef<T>
{
    private Func<T> _get;
    private Action<T> _set;

    public VarRef(Func<T> @get, Action<T> @set)
    {
        _get = @get;
        _set = @set;
    }

    public T Value
    {
        get { return _get(); }
        set { _set(value); }
    }
}

そして、次のように使用します。

var myVar = ...
var myVarRef = new VarRef<T>(() => myVar, val => { myVar = val; });

...

myVarRef.Value = "47";
Console.WriteLine(myVar); // writes 47
于 2012-05-23T18:51:17.033 に答える
1

あなたは間違った方法でそれについて行っています。ボックス化/ボックス化解除は必要なものではありません。オブジェクト参照と特定のプロパティ、およびそのプロパティの値を保存する必要があります。

人類の創造を取り消すことができる完全に一般的なシステムを作ろうとしないでください. シンプルに始めましょう。

IUndoable のようなインターフェイスで特定のオブジェクトを設定することから始めます。

[UnduableProperty] のような属性で特定のプロパティをマークします。INotifyPropertyChange インターフェイスを使用し、PropertyChanged イベントを使用します。プロパティが変更されたら、リッスンして元に戻すことができるかどうかを確認し、その値を保存します。

リフレクションを使用することを恐れないでください。ただし、速度の問題がある場合は、できるだけ避けてください。

オブジェクトを保存し、プロパティを保存し、値を保存します。元に戻すプロセスを管理するマネージャー オブジェクトを作成します。

複雑な構造体の値を保存するのに問題がある場合は、ISerializable について忘れないでください。

幸運を。

于 2012-05-23T20:41:39.643 に答える