Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当使用以下IEnumerable方法链时,如何显示编译器警告?_C#_Ienumerable_Compiler Warnings_Stylecop - Fatal编程技术网

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()
在它上面…所以用它替换
列表
可以达到想要的效果。我当然同意这是一种代码味道,尽管。。。