I have the following extension methods:
public static class QueryableOptionalDateRangeExtensions
{
public static IQueryable<T> StartsFrom<T>(this IQueryable<T> query, DateTime date)
where T : IOptionalDateRange // Might also be IRequiredDateRange
{
return query.Where(obj => obj.Start >= date);
}
public static IQueryable<T> StartsUntil<T>(this IQueryable<T> query, DateTime date)
where T : IOptionalDateRange // Might also be IRequiredDateRange
{
return query.Where(obj => obj.Start < date);
}
public static IQueryable<T> EndsUntil<T>(this IQueryable<T> query, DateTime date)
where T : IOptionalDateRange
{
return query.Where(obj => obj.End <= date);
}
}
public static class QueryableRequiredDateRangeExtensions
{
public static IQueryable<T> StartsFrom<T>(this IQueryable<T> query, DateTime date)
where T : IRequiredDateRange
{
return query.Where(obj => obj.Start >= date);
}
public static IQueryable<T> StartsUntil<T>(this IQueryable<T> query, DateTime date)
where T : IRequiredDateRange
{
return query.Where(obj => obj.Start < date);
}
public static IQueryable<T> EndsUntil<T>(this IQueryable<T> query, DateTime date)
where T : IRequiredDateRange
{
return query.Where(obj => obj.End <= date);
}
}
This however does not work since it can't infer the overloading from the type of T for some reason (although it seems possible to me).
What can be done to work around this issue?
EDIT:
Here's the IDateRange interface:
public interface IDateRange<TStart, TEnd>
{
TStart Start { get; set; }
TEnd End { get; set; }
}
It just specifies that the class has a start and an end. Now I want it to specify whether the object has an optional date range (both start and end are nullable) or a required date range (both are value types) but the same extension method must work on both and I don't really want to specify the Start and End properties' types.