0

XNAでのベクターグラフィックス管理を簡素化しようとしています。現在、州の保存を組み込むことによって。目標は、Xの描画状態のみを保持するために、2X行のプッシュ/プルコードを記述しないようにすることです。
これを行うには、クライアントに、描画を通じて保持したいクラス/構造体の参照を提供してもらいます。

また、多くの初心者プログラマーがこれを使用するため、ラムダ式やその他の高度な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 に答える