使用以下 IEnumerable 方法链时如何显示编译器警告?

How to display a compiler warning when the following IEnumerable methods chain is used?

我有以下存储库:

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() 方法。

有没有办法创建自定义警告/验证规则?允许使用 style cop。每次使用以下链时都会发出警告:

GetDataList(). (...) .FirstOrDefault()
//warning: use Repository.FirstOrDefault() instead 

郑重声明,我同意评论,这可能是糟糕的设计,但我认为你可以这样做:

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);