如果您无法实现接口并且不想使用反射,另一种解决方案可能是将如何获取日期传递给 GenericService:
按属性:
public class GenericService<T>: IGenericService<T> where T : class
{
public Func<T, DateTime> DateGetter { get; set; }
readonly IGenericRepository<T> _genericRepository;
public IEnumerable<T> GetRecordList(DateTime date)
{
var query=_genericRepository.FindBy(r => DateGetter(r) == date);
}
}
由构造函数:
public class GenericService<T>: IGenericService<T> where T : class
{
Func<T, DateTime> _dateGetter;
public GenericService(..., Func<T, DateTime> dateGetter)
{
_dateGetter = dateGetter
...
}
readonly IGenericRepository<T> _genericRepository;
public IEnumerable<T> GetRecordList(DateTime date)
{
var query=_genericRepository.FindBy(r => _dateGetter(r) == date);
}
}
按方法本身:
public class GenericService<T>: IGenericService<T> where T : class
{
readonly IGenericRepository<T> _genericRepository;
public IEnumerable<T> GetRecordList(DateTime date, Func<T, DateTime> dateGetter)
{
var query=_genericRepository.FindBy(r => dateGetter(r) == date);
}
}
按类型:
Adam Ralph 的解决方案启发了我这个解决方案(我猜不是最好的,但它仍然有效)
public class GenericService<T>: IGenericService<T> where T : class
{
public Dictionary<Type, Func<object, DateTime>> _dateGetter = new Dictionary<Type, Func<object, DateTime>>()
{
{ typeof(TypeWithDate), x => ((TypeWithDate)x).Date },
{ typeof(TypeWithDate2), x => ((TypeWithDate2)x).Date }
};
readonly IGenericRepository<T> _genericRepository;
public IEnumerable<T> GetRecordList(DateTime date)
{
var query=_genericRepository.FindBy(r => _dateGetter[typeof(T)](r) = date);
}
}