如何以惯用方式将TimeUnit添加到DateTime对象?

时间:2016-03-04 13:07:10

标签: c# datetime

所以有一个TimeUnit枚举看起来像这样

public enum TimeUnit
{
    Days,
    Weeks,
    Months,
    Years,
    Hours,
    Minutes,
    Seconds,
    Milliseconds,
    Microseconds
}

我有一个像这样的静态方法AddPeriod

public static DateTime AddPeriod(DateTime dateTime,Period period)
{
    switch (period.Units)
    {
        case TimeUnit.Days:
            {
                return dateTime.AddDays(period.Length);
            }
        case TimeUnit.Months:
            {
                return dateTime.AddMonths(period.Length);
            }
        case TimeUnit.Years:
            {
                return dateTime.AddYears(period.Length);
            }
        // every other TimeUnit enum with a similar switch statement
        default:
            {
                Log.Error("TimeUnit not implemented: " + period.Units);
                return dateTime;
            }
    }
}

但是当我实现这个时,我觉得必须有一个更好的方法来简单地添加相应的TimeUnit而不是一个庞大的switch语句....这看起来像一个合理的方法还是我错过了一些更明确或惯用的东西?

1 个答案:

答案 0 :(得分:1)

令人讨厌的方法之一是使用反射:

var method = dateTime.GetType()
                     .GetMethods(BindingFlags.Public | BindingFlags.Instance)
                     .SingleOrDefault(mi => mi.Name.EndsWith(period.Units.ToString();

method.Invoke(dateTime, period.Length);

但是讨厌,丑陋,并且可以引入错误。它不适合实际使用:-)考虑使用TimeSpan,如评论中所述。