【发布时间】:2011-09-15 12:25:33
【问题描述】:
我有以下扩展方法:
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);
}
}
但这不起作用,因为由于某种原因它无法从 T 的类型推断出重载(尽管在我看来这是可能的)。
可以做些什么来解决这个问题?
编辑:
这是 IDateRange 接口:
public interface IDateRange<TStart, TEnd>
{
TStart Start { get; set; }
TEnd End { get; set; }
}
它只是指定类有开始和结束。 现在我希望它指定对象是否具有可选的日期范围(开始和结束都可以为空)或所需的日期范围(两者都是值类型),但相同的扩展方法必须适用于两者,我真的不想指定 Start 和 End 属性的类型。
【问题讨论】:
-
@Daniel Hilgarth:已经完成,但 IDateRange 有两个用于 Start 和 End 属性的通用参数(它们可能为空或不为空),然后您无法将 T 与日期时间进行比较。
-
请将其作为对我的回答的评论发布 - 我会在那里回答您的评论。
-
你应该考虑一下那个设计。你的
IDateRange说这是一个日期范围,但我可以在里面放任何东西,例如我可以创建一个IDateRange<Guid, HttpContext>... -
您还没有展示实际发生的情况。一段简短但完整的代码显示单个方法声明(而不是 4 个)以及尝试使用它的一些东西会很有帮助。
-
好的,对我来说,需要重新考虑设计(请参阅我更新的答案)。将它开放给任何类型只是为了支持可选或必需(是/否标志)感觉不对。
标签: c# .net generics extension-methods