属性c#的固定值

时间:2017-08-04 15:51:09

标签: c# object

我有一个Movement类作为我的对象的属性。

我想要做的只是能够为此属性设置确定的值,例如:

class Movement
{
    public Direction Moving;
    public Direction Facing;
}

Movement movement = new Movement():

movement.Moving = Direction.Up;
movement.Facing = Direction.Down;

我可以使Direction.Up/Down/Left/Right为常量字符串,但我不希望能够为该属性设置任何不是Direction.Up / Down / Left / Right'的内容。

但我不知道如何制作Direction课程。

3 个答案:

答案 0 :(得分:2)

一种方法是使用Enum

int

然后,如果您需要确保存储的{{1}}值是枚举的有效值:Is there a way to check if int is legal enum in C#?

答案 1 :(得分:0)

您可以使用枚举并像这样使用它:

FILTER

但是,现在如果你想对方向做一些操作,或者做一些计算,你就不能在Direction中实现它,因为它是枚举。

您还可以创建一个抽象类Direction,并使实际方向从Direction派生,如下所示:

public enum Direction {
    1 = Up,
    2 = Right,
    3 = Down,
    4 = Left
}

public class UseDirection {
    public Direction Dir { public get; private set; }

    public void SetDirection(Direction dir) {
         Dir = dir;
    }
}

现在您可以像这样使用public abstract class Direction { private class DirectionUp : Direction { } private class DirectionDown : Direction { } private class DirectionLeft : Direction { } private class DirectionRight : Direction { } public static Direction Up => new DirectionUp(); public static Direction Down => new DirectionDown(); public static Direction Left => new DirectionLeft(); public static Direction Right => new DirectionRight(); }

Direction

这种模式很不错,因为你现在可以只使用public class AggregatesDirection { public Direction Dir { public get; private set; } public AggregatesDirection() { Dir = Direction.Up; //uses the static property in Direction that will use the private constructor of the private class in Direction. } } 接口来完成与方向相关的所有东西,并且仍然有不同的实现方式,比如说,你可以为某个方向重新定位一些东西。不同的方向类。

您也可以将类设置为公共和抽象Direction类之外,但是您可以将类型公开给命名空间,这可能不是必需的。

答案 2 :(得分:0)

我想通了,这就是我的诀窍:

public class Direction
    {
        private string value;

        private Direction(string value)
        {
            switch (value)
            {
                case "left":
                    {
                        this.value = value;
                        break;
                    }
                case "right":
                    {
                        this.value = value;
                        break;
                    }
                case "up":
                    {
                        this.value = value;
                        break;
                    }
                case "down":
                    {
                        this.value = value;
                        break;
                    }
                default:
                    throw new Exception("Valor invalido");
            }
        }

        public static class Directions
        {
            public static Direction Up = new Direction("up");
            public static Direction Down = new Direction("down");
            public static Direction Left = new Direction("left");
            public static Direction Right = new Direction("right");
        }
    }  

我将“Direction”类设为public,但它的构造函数为private,因此它只能在其自身及其子项中实例化,然后在其中创建静态类“Directions”。

所以我很容易:

this.directionMoving = Direction.Directions.Down;
this.directionLooking = Direction.Directions.Down;

我的代码中的任何地方,但不能:

Direction move = new Direction();

因为它的构造函数只能在其自身内部访问。