¿Debo hacer un objeto DateRange?

Algunos de mis objetos de dominio contienen rangos de fechas como un par de propiedades de fecha de inicio y finalización:

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; }
}

Y me encuentro con mucho de esto:

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);

El último me hizo preguntarme ... ¿Debo implementar una clase DateRange? No estoy al tanto de uno en el BCL.

En mi experiencia, profundizar la jerarquía de objetos a menudo complica las cosas. Estos objetos se envían a informes RDLC mostrados por el control ReportViewer, pero eso es secundario. Doblaré la vista al modelo en lugar de viceversa. Sin embargo, no estamos atados a los nombres de las propiedades, y estaríamos dispuestos a comprometernos con algo como:

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

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

Un beneficio de una clase DateRange sería la validación centralizada de la fecha de finalización posterior a la fecha de inicio, y simplificará las firmas de mi método:

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

Simplemente no estoy seguro de que una clase de DateRange no me traiga más problemas que su valor. Opiniones?

Pregunta paralela: ¿Me perdí una clase genérica de tupla de propósito general en el BCL en algún lugar? Sé que hay algunos muy específicos flotando en varios espacios de nombres. Contaminar las firmas de mi método de dominio público con tipos C5 se siente muy, muy sucio.

Respuestas a la pregunta(5)

Su respuesta a la pregunta