0

我正在尝试简化 XNA 中的矢量图形管理;目前通过纳入国家保存。目标是避免编写 2X 行推/拉代码,以便仅保留 X 个绘制状态。
我希望通过让客户提供他希望通过他的绘图保留的类/结构引用来做到这一点。

另请注意,许多初学者程序员将使用它,因此在客户端代码中强制使用 lambda 表达式或其他高级 C# 功能并不是一个好主意。


我试图通过使用Daniel Earwicker 的 Ptr 类来实现我的目标:

    public class Ptr<T>
    {
        Func<T> getter;
        Action<T> setter;

        public Ptr(Func<T> g, Action<T> s)
        {
            getter = g;
            setter = s;
        }

        public T Deref
        {
            get { return getter(); }
            set { setter(value); }
        }
    }

扩展方法:

        //doesn't work for structs since this is just syntatic sugar
        public static Ptr<T> GetPtr <T> (this T obj) {
            return new Ptr<T>( ()=> obj, v=> obj=v );
        }

和推送功能:

        //returns a Pop Action for later calling
        public static Action Push <T> (ref T structure) where T: struct
        {
            T pushedValue = structure; //copies the struct data
            Ptr<T> p = structure.GetPtr();

            return new Action( ()=> {p.Deref = pushedValue;} );
        }

但是,这不起作用,如代码中所述。

我怎样才能实现我的目标?

4

1 回答 1

0

我知道你想避免委托,但实际上,这可能是一个更干净的选择。例如,您可以获得如下代码:

DrawingState state;

// ...
StateUtil.RestoreAfter(ref state, () => {

    state.Modify(...);

});

// state is now restored to the previous value

...使用以下方法:

public static class StateUtil
{
    public static void RestoreAfter<T>(ref T state, Action action) where T : struct
    {
        var copy = state;
        action();
        state = copy;
    }
}

您可以使用ICloneable代替结构,并且可以添加多个ref参数以支持恢复多个变量的状态。

于 2012-10-06T00:38:56.913 回答