我正在尝试简化XNA中的矢量图形管理;目前通过纳入国家保护。 目标是避免编写2X行推/拉代码,以便仅保留X绘制状态。
我希望通过让客户给出他希望通过他的绘图保留的类/结构参考来做到这一点。
另请注意,许多初学者程序员都会使用它,因此强制在客户端代码中使用lambda表达式或其他高级C#功能并不是一个好主意。
我尝试使用Daniel Earwicker's Ptr class:
来实现目标 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;} );
}
但是,这不符合代码中的规定。
我如何实现目标?
答案 0 :(得分: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
参数以支持恢复多个变量的状态。