【问题标题】:Generically filtering Lists for .NET 4.5 and parameterless constructors.NET 4.5 和无参数构造函数的一般过滤列表
【发布时间】:2015-06-18 13:32:19
【问题描述】:

我查看了 Stack Overflow 的所有内容,但找不到此问题的答案。 我正在尝试根据传入的通用标准对 IEnumerable 对象进行通用过滤。

private IEnumerable<TListItem> FilterList<TListItem, TListCriteria>(TListCriteria criteria) where TListItem: new()
{
//Do Work
return new IEnumerable<TListItem>();
}

问题是我有一个构造函数,并且我收到一个错误,即 TListItem 必须是具有公共无参数构造函数的非抽象。对于这种类型的泛型调用,如何使用带有参数构造函数的类?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    问题不是TListItem,而是IEnumberable是一个接口,根本无法实例化,所以不能返回new IEnumerable。试试:

    return Enumerable.Empty<TListItem>();
    

    其次,你已经为你的泛型指定了一个约束:

    where TListItem : new()
    

    这正好意味着“TListItem 必须是具有无参数构造函数的类型”。因此,如果不需要,您可能希望删除该约束。

    【讨论】:

    • 如果目标是过滤 IEnumerable&lt;T&gt; 并返回它,您可能需要添加,那么您需要返回实现它的东西(如 List&lt;T&gt;)。
    • 没有必要。返回 someEnumerableAsInput.Where(p => p.SomeCondition);将返回相同类型的 IEnumerable,但不一定是 List
    • 我没有说它必须是一个列表,但它必须是实现IEnumerable&lt;T&gt;somethingList&lt;T&gt; 是一个选项,一些 LINQ 查询也是如此。如果目标是过滤某些内容,则返回一个空的可枚举对象可能没有多大用处。
    • 当然,但是 OP 的代码也试图返回一个“新的 IEnumerable”,所以我展示了如何正确创建一个空的枚举。无论如何...我认为他的问题与我回答的第二部分有关,即 new() 约束
    • 我能够取出 new() 并使用 IEnumerable 作为参数。所以我有以下内容: private IEnumerable FilterModelList(IEnumerable modellist, TListCriteria criteria) { //do work.. return modelList.Where(compiledlambdaexpression); } 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多