我有以下代码:
public class CrudModel<T> : ICrudModel<T> where T : DomainBase
{
public IQueryable<T> GetAll()
{
return Repository.Query<T>();
}
}
问题是一些对象(T)我需要做一个额外的过滤器,所以我创建了一个单独的方法,如下所示:
public IEnumerable<TR> GetAllwithinOrg<TR>() where TR : DomainBase, IFilterable
{
var items = Repository.Query<TR>();
return FilterwithinOrg(items);
}
其中过滤器方法如下所示:
public IEnumerable<TResult> FilterwithinOrg<TResult>(IEnumerable<TResult> linked) where TResult : IFilterable
{
var dict = GetDict();
return linked.Where(r => dict.ContainsKey(r.Id));
}
这一切都很好,但问题是我必须记住调用方法 1 或方法 2(基于对象是否支持IFilterable
接口
在这个问题上,我得到了这样做的建议:
public IQueryable<T> GetAll()
{
var items = Repository.Query<T>();
if (typeof(IFilterable).IsAssignableFrom(typeof(T)))
{
items = FilterwithinOrg(items.Cast<IFilterable>()).Cast<T>().AsQueryable();
}
return items;
}
所以我可以用一种方法支持这两种用例。这似乎可行,但我试图了解这样做会带来什么样的性能影响
items.Cast<IFilterable>()).Cast<T>().AsQueryable()
如果它很糟糕,那么我将记住从外部调用 2 个单独的方法,但显然只有一个会很方便。有什么建议么?
如果我忘记调用第二种方法,但我想再次查看是否可以将其保留为仅一种方法,以使其对外部调用者更简单,我想我会将其保留为备份。