我有以下存储库:
public interface IRepository<T>
{
List<T> GetDataList();
T FirstOrDefault(Func<T, bool> predicate);
}
大部分时间都使用GetDataList()
。但是出于性能原因,有一个方法FirstOrDefault()
是一个优化版本,并且利用了只返回一个域数据对象。
我们的想法是避免这种情况:
MyRepo.GetDataList().FirstOrDefault(x => x.SomeField == ...) //many deep copy
然后使用它:
MyRepo.FirstOrDefault(x => x.SomeField == ...) //single deep copy
然而,一些开发人员使用第一种技术(非最佳),因为他们不知道存储库FirstOrDefault()
方法。
有没有办法创建自定义警告/验证规则?允许使用样式警察。每次使用以下链时都会发出警告:
GetDataList(). (...) .FirstOrDefault()
//warning: use Repository.FirstOrDefault() instead
答案 0 :(得分:2)
为了记录,我同意评论,这可能是糟糕的设计,但我认为你可以这样做:
public class MyList<T> : List<T>
{
[Obsolete("don't do this")]
public T FirstOrDefault(Expression<Func<T, bool>> exp)
{
//could call underlying method; calling this will return null/0/etc
return default(T);
}
}
public interface IRepository<T>
{
MyList<T> GetDataList();
T FirstOrDefault(Func<T, bool> predicate);
}
以下代码具有评论中描述的效果:
var tmp = new MyList<int>();
//this gives compiler warning & green underline in visual studio:
var xxx = tmp.FirstOrDefault(x => x == 0);
//this doesn't give compiler warning as you're calling the underlying method
var yyy = (tmp as List<int>).FirstOrDefault(x => x == 0);