创建仅具有特定int值的对象

时间:2017-01-18 22:18:12

标签: c# object enums model

我有一个枚举Days,如下所示:

public enum Days
    {
        Sunday = 1,
        Monday = 2,
        Tuesday = 3,
        Wednesday = 4,
        Thursday = 5,
        Friday = 6,
        Saturday = 7,
    }

我想为Hours设置类似的枚举/对象,强制该值为int0之间的23,即看起来像:

public enum Hours
    {
        0,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15,
        16,
        17,
        18,
        19,
        20,
        21,
        22,
        23,
    }

它只有一个int值而且没有标识符。现在我知道枚举不能像这样工作所以我不能使用枚举,但是有另一种方法我可以用这样的对象来完成吗?

4 个答案:

答案 0 :(得分:1)

如果你真的不想使用datetime,那么你的下一个最好的事情就是使用带有一些隐式转换的结构

function drawRed(ctx, x, y, rad) {
  ctx.save();
  ctx.fillStyle = 'red';
  ctx.translate(x, y);
  ctx.beginPath();
  ctx.arc(0, 0, rad, 0, 2*Math.PI , false);
  ctx.fill();
  ctx.fillStyle = '#A00';
  ctx.fillRect(-4, -4, 8, 8);
  ctx.restore();  
}

隐式运算符允许您在大多数时间将对象视为int,而validate函数确保您始终具有有效值。

所以你应该可以做public struct Hour { private int val; public Hour(int val) { validate(val); this.val = val; } private static void validate(int hour) { if (hour < 0 || hour > 23) throw new Exception("it broke"); } public static implicit operator int(Hour h) { return h.val; } public static implicit operator Hour(int d) { return new Hour(d); } } Hour h = 23;但不能int time = h;

这样的事情

答案 1 :(得分:1)

枚举实际上并不强制该值为给定值之一。例如,即使你有这样的枚举:

public enum Numbers
{
    Zero = 0,
    One = 1,
    Two = 2
}

以下仍被视为合法语法:

Numbers n = (Numbers)3;

相反,您应该做的是为Hours字段创建一个属性并验证输入,以便在给定值不在允许范围内时抛出异常:

private int _hours;
public int Hours
{
    get { return _hours; }
    set 
    {
        if (value < 0 || value > 23)
            throw new ArgumentOutOfRangeException(nameof(Hours), "The value must be between 0 and 23");
        _hours = value;
    }
}

话虽这么说,你正在使用的是一天一小时(大概是几分钟或几秒或几个月),所以DateTime对象已经拥有你需要的所有功能。

private DateTime _dt;

public int Days
{
    get { return _dt.Day; }
    set { _dt = new DateTime(_dt.Year, _dt.Month, value, _dt.Hour, _dt.Minute, _dt.Second, _dt.Millisecond); }
}

public int Hours
{
    get { return _dt.Hour; }
    set { _dt = new DateTime(_dt.Year, _dt.Month, _dt.Day, value, _dt.Minute, _dt.Second, _dt.Millisecond); }
}

答案 2 :(得分:1)

我会在二传手中检查:

private int hour;
public int Hour
{
    get { return hour; }
    set
    {
        if (value < 0 || value > 23)
            throw new ArgumentOutOfRangeException();
        hour = value;
    }
}

答案 3 :(得分:0)

您可以为每个数字创建一个包含单词的枚举,也可以创建一个长度为24的数组,其中每个索引的值等于索引。

例如:

enum
{
   Zero = 0,
   One,
   Two
}

var days = int[24] { 0, 1, 2, ..., 22, 23 };
days[0]; // == 0