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

4

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

这是我想要实现的效果:

DateTime.Now.Add(-TimeUnits.Week)

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

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

我看过一个Struct,但是我的经验太少了,无法确定这是否可能!目前,我有一个枚举,当然非常有限。 我不特别限制于枚举,因此可以是任何其他对象!

我的枚举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");
    }
}

简短回答是肯定的。枚举会被转换为整数,因此您可以通过取负或乘以-1来实现。此外,您需要更改枚举以表示天数,例如week = 7,day = 1(但我不知道如何处理月份和季度)。 - gh9
没错,这正是我所想的!月份和季度确实是我的关注重点! - 321X
1
如果枚举不是标志枚举,你不应该给枚举名称加复数形式。参考链接:http://msdn.microsoft.com/zh-cn/library/ms229040.aspx - Hamid Pourjam
2个回答

2
枚举类型严格来说只是为数字定义命名常量的一种方式。换句话说:表达式-((int(TimeUnit.Week)只是另一种更易于人类阅读的方式来写字面值-2
尽管从技术上讲,“否定”这样的值是完全可能的(因为它确实是编译器的整数),但不应该这样做。从概念上讲,这是一个可怕的主意,这将是对枚举概念的完全误用。- 对于你要做的事情,请使用简单的常量或者如果可能的话定义一个Subtract()方法。

你甚至可以指定一个“枚举”的存储类型,例如“enum TimeUnits:long { /* ... */ }”。我强烈建议阅读有关“枚举”的MSDN页面 - Binkan Salaryman

0

将您的签名更改为:

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

其中units是要添加到currentunitOfTime数量。


这使得编写以下代码成为可能:

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...

注意:你也可以将其声明为double units,但要注意浮点算术精度和NaN值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接