2

Direction次のような列挙型を作成しました。

enum Direction { Up, Down, Left, Right }

現在、これらの方向は矢印キーを押すと呼び出されます。私のKeyDownイベントで今持っているのはこれです:

if (e.KeyCode == Keys.Up)
{
    moveDirection = Direction.Up;
}
else if (e.KeyCode == Keys.Left)
{
    moveDireciton = Direction.Left;
}
else if ...

のような独自のキャストを作成することは可能(Direction)Keys.Upですか?

静的メソッドstatic Direction CastKeysToDirection(Keys k);を作成できることはわかっていますが、これで問題ありませんが、C# で独自のキャストを実装する方法があるかどうかに興味がありますか?

4

3 に答える 3

7

列挙型を次のように定義する場合

enum Direction {
    Up = Keys.Up,
    Down = Keys.Down,
    Left = Keys.Left,
    Right = Keys.Right
}

次に、基になる数値が基になる数値と同じ(Direction)Keys.Upであるという事実により、キャストが機能するはずです。Keys.UpDirection.Up

残念ながら、 でできるように で true またはキャストを提供することはできexplicitませimpilcitん。enumclass

于 2013-02-26T14:41:32.353 に答える
5

2 つのオプション:

  • 値が一致することが確実な場合は、キャストするだけです(たとえば、値として etc をDirection使用して列挙型を作成したため):Keys.Up

    moveDirection = (Direction) e.KeyCode;
    
  • 辞書を作成します。

    private static readonly Dictionary<Keys, Direction> KeyToDirection =
        new Dictionary<Keys, Direction>
        {
            { Keys.Up, Direction.Up },
            { Keys.Left, Direction.Left },
            ...
        };
    

    次に、辞書で押されたキーを調べます。(TryGetValue検索に使用Keys- 戻り値を使用して、辞書に存在しないキーを検出します。)

もちろん、後者はより柔軟なアプローチを提供します。たとえば、複数のキーをすべて同じ方向にマッピングできます。

于 2013-02-26T14:41:42.173 に答える
3

enumへの暗黙的なキャストはできませんが、クラスの実装で暗黙的な演算子を使用して、その後の作業でポリモーフィズムとカプセル化のいくつかの利点を使用できます (@Chris Sinclair の提案を含む):

public abstract class Direction
{
    public static implicit operator Direction(Keys key)
    {
        switch (key)
        {
            case Keys.Up:
                return Up.Instance;
            case Keys.Down:
                return Down.Instance;
            case Keys.Left:
                return Left.Instance;
            case Keys.Right:
                return Right.Instance;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
}

public class Up : Direction
{
    private static readonly Up _Instance = new Up();
    public static Up Instance
    {
        get { return _Instance; }
    }

    private Up() {}
}

public class Down : Direction
{
    private static readonly Down _Instance = new Down();
    public static Down Instance
    {
        get { return _Instance; }
    }

    private Down() {}
}

public class Left : Direction
{
    private static readonly Left _Instance = new Left();
    public static Left Instance
    {
        get { return _Instance; }
    }

    private Left() {}
}

public class Right : Direction
{
    private static readonly Right _Instance = new Right();
    public static Right Instance
    {
        get { return _Instance; }
    }

    private Right() {}
}

使用例:

Keys key = Keys.Up;
Direction direction = key; // Legal

if (direction == Up.Instance)
{
    // Do something
}

// Or add abstract methods to Direction class and invoke direction.DoWork()
于 2013-02-26T14:48:45.370 に答える