使用以下 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);
我有以下存储库:
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);