使用通用方法调用通用方法

6

我很烦恼,因为我想从另一个通用方法中调用一个通用方法。

这是我的代码:

public List<Y> GetList<Y>(
                string aTableName,
                bool aWithNoChoice)
{
  this.TableName = aTableName;
  this.WithNoChoice = aWithNoChoice;

  DataTable dt = ReturnResults.ReturnDataTable("spp_GetSpecificParametersList", this);

  //extension de la classe datatable
  List<Y> resultList = (List<Y>)dt.ToList<Y>();

  return resultList;  
}

实际上,当我调用ToList时,它是DataTable类的一个扩展(从这里学到的)。

编译器说Y不是非抽象类型,不能将其用于.ToList<>泛型方法。我做错了什么?

谢谢阅读..


也许可以从可编译的代码开始?我假设应该是 dt.AsEnumerable().ToList<T>() - H H
1
@Henk Holterman:OP似乎正在使用自定义扩展方法,而不是LINQ to Objects的Enumerable.ToList方法。 - Ani
@Ani:我想是这样,但那应该是需要提及的事情。 - H H
@Henk Holterman:“我调用了ToList,它是DataTable类的扩展(在这里学到的)。” 这是提及。 - bAN
4个回答

11
更改方法签名为:
public List<Y> GetList<Y>(
                string aTableName,
                bool aWithNoChoice) where Y: new()
你需要这样做的原因是,你使用的自定义扩展方法对其泛型类型参数施加了new()约束。它肯定需要这么做,因为它创建该类型的实例来填充返回的列表。
显然,你还需要以表示具有公共无参构造函数的非抽象类型的泛型类型参数来调用此方法。

5
听起来你需要:
public List<Y> GetList<Y>(
     string aTableName,
     bool aWithNoChoice) where Y : class, new()
{ ... }

2
WHERE Y : new() 和 WHERE Y: class, new() 有什么区别?感谢回复! - bAN
2
@bAN - where Y : class 确保 Y 是一个引用类型(很可能是一个class)。实际上你可能不需要这个 - 重新阅读链接的 ToList,它只需要 where Y : new(),所以 @Ani 的答案是正确的。 - Marc Gravell

4

1

我猜你需要使用where子句对泛型类型进行约束。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接