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

时间:2017-11-08 13:21:51

标签: c# ienumerable compiler-warnings stylecop

我有以下存储库:

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 

1 个答案:

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