一些my domain对象包含一对开始日期和结束日期属性的日期范围:

public class Period {
  public DateTime EffectiveDate { get; set; }
  public DateTime ThroughDate { get; set; }
}

public class Timeline {
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

我发现自己有很多这样的经历:

abstract public int Foo(DateTime startDate, DateTime endDate);
abstract public decimal Bar(DateTime startDate, DateTime endDate);
abstract public ICollection<C5.Rec<DateTime, DateTime>> FooBar(DateTime startDate, DateTime endDate);

最后一个让我好奇...我应该实现DateRange类吗?我不知道BCL里有一个.

根据我的经验,加深对象层次 struct 往往会使事情复杂化.这些对象确实会被发送到ReportViewer控件显示的RDLC报告,但这是次要的.我将使视图与模型相适应,而不是相反.不过,我们并不拘泥于房产名称,我们愿意妥协如下:

public class DateRange {
  public DateTime StartDate { get; set; }
  public DateTime EndDate { get; set; }
}

Period p = new Period();
DateTime t = p.EffectiveDateRange.StartDate;

DateRange类的一个好处是集中验证开始日期之后的结束日期,并且它将简化我的方法签名:

abstract public int Foo(DateRange dateRange);
abstract public decimal Bar(DateRange dateRange);
abstract public ICollection<DateRange> FooBar(DateRange dateRange);

我只是不确定DateRange类不会给我带来更多的麻烦.意见?

附带问题:我是否错过了BCL中的通用元组类?我知道在不同的名称空间中有一些非常具体的名称.用C5类型污染我的公共域方法签名感觉非常非常肮脏.

推荐答案

不,你没有错过一门通用课.

我有一个Range类型的MiscUtil,你可能会感兴趣-它当然是简单的DateTime操作.参考Marc的答案,我不记得这是一个 struct 还是一个类——当然,欢迎您更改它.

由于Marc的泛型诡计(至少假设你使用的是.NET3.5——它在2.0中是可行的,但目前还不受支持),它很好而且很容易实现;

Range<DateTime> range = 19.June(1976).To(DateTime.Today);

foreach (DateTime date in range.Step(1.Days())
{
    // I was alive in this day
}

(这也使用了一系列扩展方法——对测试比生产更有用.)

为了解决马克答案中的另一点,Noda Time肯定能够比Noda Time更恰当地表达日期的概念.NET API,但我们目前没有类似的范围...不过这是个好主意——我加了一个feature request.

.net相关问答推荐

Azure管道-使用.NET 8 RC2 SDK生成C#项目失败

如何将多个安装程序Bundle 到一个安装程序中?

.NET Core 中的微服务

.NET 4.5 项目未在 Visual Studio 2022 中编译

如何在没有抽象基类的情况下强制覆盖后代中的方法?

如何让 DateTimePicker 显示一个空字符串?

File.ReadAllLines() 和 File.ReadAllText() 有什么区别?

什么决定了 Path.GetTempPath() 的返回值?

什么是 project.lock.json?

使用 .NET 中的代码更改桌面墙纸

我应该在 LINQ 查询中使用两个where子句还是&&?

System.String.Copy 在 .NET 中有什么用?

MemoryStream.Close() 或 MemoryStream.Dispose()

监听依赖属性的变化

如何从文件中删除单个属性(例如只读)?

是 C# 中的 bool 读/写原子

Windows 服务在哪个目录中运行?

序列化一个可为空的 int

在类型 c# 上切换大小写

连接字符串而不是使用一堆 TextBlocks