【问题标题】:How to convert List<object> to IEnumerable<T>如何将 List<object> 转换为 IEnumerable<T>
【发布时间】:2016-01-12 19:47:52
【问题描述】:

如果给出下面的代码,我如何将expected 作为IEnumerable&lt;T&gt; 返回?

public List<object> expected = new List<object>();

public IEnumerable<T> SqlQuery<T>(string sql)
{
    // Return expected as IEnumerable<T>
}

(这是一个为单元测试创​​建的类,用于模拟实体框架SqlQuery&lt;T&gt; 方法。我们可以提前设置我们的预期结果,然后让它返回您期望的结果。)

【问题讨论】:

  • 为什么expected 是字段而不是List&lt;T&gt; 类型的局部变量?
  • @MichaelLiu 这是一个为单元测试创​​建的类,用于模拟 EF SqlQuery 类。我们可以提前设置我们的预期结果,然后让它返回您所期望的结果。
  • return expected.Select(e =&gt; e.Cast&lt;T&gt;()); ?
  • 不清楚您要做什么。你为什么首先使用List&lt;object&gt;

标签: c# .net generics ienumerable


【解决方案1】:

假设expected 确实包含T 类型的实例,您可以使用LINQ Cast 运算符:

public IEnumerable<T> SqlQuery<T>(string sql)
{
    return expected.Cast<T>();
}

如果任何元素的强制转换失败,将抛出 InvalidCastException。

【讨论】:

  • 如果真的那么为什么不使用OfType会更安全?
  • @VadimMartynov:我认为如果单元测试中有错误,最好炸掉,而不是默默地忽略不良元素。
【解决方案2】:

如果您有一个包含许多子类型的列表并且您只想返回特定的子类型,您也可以这样做:

public IEnumerable<T> SqlQuery<T>(string sql)
{
    return expected.OfType<T>();
}

在这种情况下,假设您有一个Person 类,它是CopsRobbers 的基类。

如果你想要你收藏中的所有“人”,你可以写:OfType&lt;Person&gt;

但如果你只想要收藏中的强盗,请使用OfType&lt;Robbers&gt;

如果您请求expected 集合中不存在的类型,例如OfType&lt;Footballer&gt;,则将返回一个空集合。

【讨论】:

    【解决方案3】:

    最好使用 LINQ Cast 运算符转换为所需的 IEnumerable。

    public IEnumerable<T> SqlQuery<T>(string sql)
    {
    return expected.Cast<T>();
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2019-02-03
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      相关资源
      最近更新 更多