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 回答