将引用存储在另一个变量中

Tgy*_*gys 5 .net c# reference

我一直在搜索,但我找不到任何方法来存储对某个变量中另一个变量的引用.我正在尝试创建一个类来撤消用户完成的事情;

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我想你可以看到我在这里想要实现的目标.

我跑的问题;

this.var = var;
Run Code Online (Sandbox Code Playgroud)

不存储引用,而是存储引用的'var'的值.我如何存储引用本身,所以我可以简单地运行;

this.var = val;
Run Code Online (Sandbox Code Playgroud)

在我的情况下,"撤消"一个动作?

Rom*_*kov 10

标准安全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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

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

...

myVarRef.Value = "47";
Console.WriteLine(myVar); // writes 47
Run Code Online (Sandbox Code Playgroud)