C# 当使用以下IEnumerable方法链时,如何显示编译器警告?
我拥有以下存储库:C# 当使用以下IEnumerable方法链时,如何显示编译器警告?,c#,ienumerable,compiler-warnings,stylecop,C#,Ienumerable,Compiler Warnings,Stylecop,我拥有以下存储库: public interface IRepository<T> { List<T> GetDataList(); T FirstOrDefault(Func<T, bool> predicate); } 用这个代替: MyRepo.FirstOrDefault(x => x.SomeField == ...) //single deep copy 但是,一些开发人员使用第一种技术(这是非最佳的),因为他们
public interface IRepository<T>
{
List<T> GetDataList();
T FirstOrDefault(Func<T, bool> predicate);
}
用这个代替:
MyRepo.FirstOrDefault(x => x.SomeField == ...) //single deep copy
但是,一些开发人员使用第一种技术(这是非最佳的),因为他们不知道存储库FirstOrDefault()
方法
有没有办法创建自定义警告/验证规则?允许使用样式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);
}
公共类MyList:列表
{
[过时(“不要这样做”)]
公共T FirstOrDefault(表达式exp)
{
//无法调用基础方法;调用此方法将返回null/0/etc
返回默认值(T);
}
}
公共接口假定
{
MyList GetDataList();
T FirstOrDefault(Func谓词);
}
以下代码具有注释中描述的效果:
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);
var tmp=new MyList();
//这会在visual studio中为编译器提供警告和绿色下划线:
var xxx=tmp.FirstOrDefault(x=>x==0);
//在调用底层方法时,这不会向编译器发出警告
变量yyy=(tmp作为列表).FirstOrDefault(x=>x==0);
恕我直言,我同意您的意见,这可能是个糟糕的设计,但我认为您可以这样做:
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);
}
公共类MyList:列表
{
[过时(“不要这样做”)]
公共T FirstOrDefault(表达式exp)
{
//无法调用基础方法;调用此方法将返回null/0/etc
返回默认值(T);
}
}
公共接口假定
{
MyList GetDataList();
T FirstOrDefault(Func谓词);
}
以下代码具有注释中描述的效果:
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);
var tmp=new MyList();
//这会在visual studio中为编译器提供警告和绿色下划线:
var xxx=tmp.FirstOrDefault(x=>x==0);
//在调用底层方法时,这不会向编译器发出警告
变量yyy=(tmp作为列表).FirstOrDefault(x=>x==0);
你不能让IEnumerable GetData()
然后其他开发人员自己“优化”它吗?为什么GetDataList
不能返回IQueryable
,这样开发人员就可以利用他们现有的LINQ经验,而不是每次你拍拍他们的手?@Sinatr你需要让它IQueryable
,否则同样的问题也会发生。@Evk,同意如果它是一个查询(例如数据库)。@Damien_不相信者:这看起来是个好主意(它提供了比使用自定义存储库方法更大的灵活性)我希望避免更改在很多项目中使用的方法的返回类型。可能有数千个调用要修复和检查(IQueryable
!=列表
)。难道你不能将IEnumerable GetData()
设置为“优化"它本身?为什么GetDataList
不能返回IQueryable
,这样开发人员就可以利用他们现有的LINQ经验,而不是每次他们这么做时你都拍打他们的手?@Sinatr你需要将它设置为IQueryable
,否则同样的问题也会发生。@Evk,同意如果这是一个问题ery(例如数据库)。@Damien_不信者:虽然这看起来是个好主意(而且它提供了使用自定义存储库方法的更多灵活性),但我希望避免更改该方法的返回类型,因为该方法用于很多项目。可能有数千个调用需要修复和检查(IQueryable
!=列表
)。应该是另一种方式。FirstOrDefault()
不是问题,而是GetDataList()
。我读到的方式是,他们希望对GetDataList()的结果调用FirstOrDefault()
返回警告。我的示例代码没有使用存储库-只是显示了MyList
的行为与List
类似,除非您尝试使用FirstOrDefault()
在它上面…所以用它替换列表可以达到预期的效果。我当然同意这是一种代码味道…但应该是另一种方式。FirstOrDefault()
不是问题,而是GetDataList()
。我读到的方式是他们想要FirstOrDefault()
调用GetDataList()
的结果以返回警告。我的示例代码没有使用存储库-只是显示MyList
的行为与List
类似,除非您尝试使用FirstOrDefault()
在它上面…所以用它替换列表
可以达到想要的效果。我当然同意这是一种代码味道,尽管。。。