反转对象或使用减号将其标记为负数

时间:2014-12-08 20:29:13

标签: c# .net datetime enums

是否可以反转对象或将其标记为否定?

这就是我想要实现的目标:

DateTime.Now.Add(-TimeUnits.Week)

这应该返回当前日期时间减去7天。

所以我必须在Add方法中检测传递的对象是否为负数!

我看过Struct,但我对它们的体验太少,无法判断这是否可能! 目前,我有一个enum,当然非常有限。 我没有专门绑定枚举,所以它可以是任何其他对象!

我的枚举TimeUnits

public enum TimeUnits
{
    Once = 0,
    Day = 1,
    Week = 2,
    Month = 3,
    Quarter = 4,
    Year = 5
}

我在DateTime上有一个扩展方法,我希望将对象传递给方法Add,如下所示:

private static DateTime? Add(this DateTime current, TimeUnits unitOfTime)
{
    switch (unitOfTime)
    {
        case TimeUnits.Once:
            return null;
        case TimeUnits.Day:
            return current.AddDays(1);
        case TimeUnits.Week:
            return current.AddDays(7);
        case TimeUnits.Month:
            return current.AddMonths(1);
        case TimeUnits.Quarter:
            return current.AddMonths(3);
        case TimeUnits.Year:
            return current.AddYears(1);
        default:
            throw new ArgumentOutOfRangeException("unitOfTime");
    }
}

2 个答案:

答案 0 :(得分:2)

严格来说,枚举类型只是一种为数字定义命名常量的方法。换句话说:表达式-((int(TimeUnit.Week)只是以一种对人类更具可读性的方式编写文字-2的另一种方式。

虽然在技术上完全可以否定'这样的值(因为它确实是编译器的int),你不应该这样做。从概念上讲,这是一个可怕的想法,它将完全滥用枚举的概念。 - 将简单常量用于您要执行的操作,或者,如果可能,请定义Subtract()方法。

答案 1 :(得分:0)

将您的签名更改为:

private static DateTime? Add(this DateTime current, int units, TimeUnits unitOfTime)

其中units是要添加到unitOfTime的{​​{1}}的数量。


这使得写:

成为可能
current

注意:或者您可以将其声明为DateTime.Now.Add( 1, TimeUnits.Week); // add a week DateTime.Now.Add( 42, TimeUnits.Week); // add multiple weeks DateTime.Now.Add(- 1, TimeUnits.Week); // subtract a week DateTime.Now.Add(-42, TimeUnits.Week); // subtract multiple weeks DateTime.Now.Add( 0, TimeUnits.Week); // return `current` //etc... ,但要注意浮点算术精度 NaN 值。< / p>