枚举自定义对象?

时间:2014-07-14 19:31:18

标签: c# enums

我的目标是创建一个具有一定数量不同状态的“GameState”类型。 我希望它的行为几乎完全像枚举集,但我希望有一个以上的整数作为数据。

举个例子,这就是我想要做的事情:

switch(this.gameState)
{
   case(Wait):
      if(elapsedTime > gameState.TimeOutTime)
         //do stuff
   break;
   case(Play):
      if(elapsedTime > gameState.TimeOutTime)
         //do other stuff
   break;
}

因此,我不想将GameState作为整数枚举,而是希望它包含TimeOutTime等变量以及有关该GameState的其他有用信息。

有没有办法为枚举添加深度,还是我只是以错误的角度攻击这个问题?

4 个答案:

答案 0 :(得分:5)

已经有很好的答案(@ Selman22,@ Max)。

但我猜他们错过了一个重要的信息:You should not switch on type。改为使用多态。

因此,根据您的示例,您应该使用以下内容:

public abstract class GameState
{
    public int TimeOutTime { get; set; }

    public void CheckDoStuff()
    {
        if (elapsedTime > gameState.TimeOutTime) DoStuff();
    }

    protected abstract void DoStuff();
}

public WaitState : GameState
{
    protected override DoStuff()
    {
        // Do stuff (wait)
    }
}

public PlayState : GameState
{
    protected override DoStuff()
    {
        // Do other stuff (play)
    }
}

注意:我没有添加任何enum,因为我不认为在这种情况下确实需要一个。{/ p>

答案 1 :(得分:2)

你想要的是class。您无法使用enums执行此操作,而是添加一个类并使枚举成为您的类的属性。

class GameState
{
    public GameStateEnum State { get; set; }
    public int TimeOutTime { get; set; }
    // other properties...
}

答案 2 :(得分:1)

您可以轻松地为此创建一个类:

public class GameState
{
   public StateEnum State {get; set;}
   public DateTime TimeOutTime {get; set;}
}

创建GameStates列表很简单:

List<GameState> gameStateList = new List<GameState>();

答案 3 :(得分:1)

你不能用.NET enums(你可以使用Java)

假设您elapsedTime是DateTime,例如:

使用System;

public class GameState
{
    private readonly TimeOutTime _timeOutTime;

    public GameState(TimeOutTime timeOutTime)
    {
        _timeOutTime = timeOutTime;
    }

    public TimeOutTime TimeOutTime { get { return _timeOutTime; } }
}

public class TimeOutTime
{
    private readonly DateTime _dateTime;

    public TimeOutTime(DateTime dateTime)
    {
        _dateTime = dateTime;
    }

    public static implicit operator DateTime(TimeOutTime timeOutTime)
    {
        return new TimeOutTime(timeOutTime);
    }

    public static implicit operator TimeOutTime(DateTime timeOutTime)
    {
        return new TimeOutTime(timeOutTime);
    }
}