9

わかりましたので、データ型の値を変更するジェネリック クラスを作成したいと思います。これをやりたい理由は、元に戻すおよびやり直しメソッドを使用できるようにするためです。必要な値の型ごとにクラスを作成できます。IE double、int ... しかし、これを行うジェネリック クラスを作成できれば、はるかに簡単になります。

これは私が持っているものです

class CommandChangeDouble : Command
{
    double _previous;
    double _new;
    double* _objectRef;

    public unsafe CommandChangeDouble(double* o, double to)
    {
        _objectRef = o;
        _previous = *o;
        _new = to;
        *_objectRef = _new;
    }

    public unsafe void Undo()
    {
        *_objectRef = _previous;
    }
    public unsafe void Redo()
    {
        *_objectRef = _new;
    }
}

これは私が欲しいものです

class CommandChangeValue<T> : Command
{
    T _previous;
    T _new;
    T* _objectRef;

    public unsafe CommandChangeValue(T* o, T to)
    {
        _objectRef = o;
        _previous = *o;
        _new = to;
        *_objectRef = _new;
    }

    public unsafe void Undo()
    {
        *_objectRef = _previous;
    }
    public unsafe void Redo()
    {
        *_objectRef = _new;
    }
}

しかし、これによりエラー「マネージ型( 'T')のアドレスを取得したり、サイズを取得したり、ポインターを宣言したりできません」というエラーが表示されます

これを行うためのより良い方法、またはこのエラーを回避する方法はありますか?

4

5 に答える 5

17

レコードのために、これらのメソッドを使用して、ジェネリック型またはその他の型へのポインターを取得できます....

    /// <summary>
    /// Provides the current address of the given element
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
    public static System.IntPtr AddressOf<T>(T t)
        //refember ReferenceTypes are references to the CLRHeader
        //where TOriginal : struct
    {
        System.TypedReference reference = __makeref(t);

        return *(System.IntPtr*)(&reference);
    }

    [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
    static System.IntPtr AddressOfRef<T>(ref T t)
    //refember ReferenceTypes are references to the CLRHeader
    //where TOriginal : struct
    {
        System.TypedReference reference = __makeref(t);

        System.TypedReference* pRef = &reference;

        return (System.IntPtr)pRef; //(&pRef)
    }

配列で使用されるスライスの形式を実装するために、それらを他のいくつかと一緒に使用しました。

于 2016-05-04T00:56:55.590 に答える
-4

別の回答やコメントで述べられているように、ポインターを使用しないでください。また、アプリに元に戻す/やり直し機能が必要な場合は、Memento パターンを調べることをお勧めします。

于 2013-06-17T20:27:10.000 に答える
-5

ポインターを使用しないでください。

通常の参照を使用し、常にこのクラスのプロパティを介して値を操作すると、すべて正常に機能します。

于 2013-06-17T20:25:36.490 に答える