如何将List<object>转换为IEnumerable<T>?

3

如何在下面的代码中返回IEnumerable<T>类型的expected

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

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

这是一个专门为单元测试而创建的类,用于模拟Entity Framework中的SqlQuery<T>方法。我们可以提前设置预期结果,并使其返回我们所期望的结果。


为什么expected是一个字段而不是类型为List<T>的局部变量? - Michael Liu
1
@MichaelLiu 这是一个为了单元测试而创建的类,用于模拟EF SqlQuery类。我们可以预先设置期望的结果,然后让它返回你所期望的内容。 - user3953989
1
返回已选择的 expected 序列,其中每个元素都会进行类型转换为类型 T - Alexander Derck
1
你尝试做什么并不是很清楚。为什么一开始要使用 List<object> - David
3个回答

9

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

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

如果转换失败,将会抛出 InvalidCastException 异常。


如果确实需要,为什么不使用 OfType 呢?这样会更安全。 - Vadim Martynov
5
我认为,如果单元测试中存在bug,最好直接爆炸,而不是悄无声息地忽略错误的元素。 - Michael Liu

1
如果您有一个包含多个子类型的列表,并且只想返回特定的子类型,则也可以这样做:
public IEnumerable<T> SqlQuery<T>(string sql)
{
    return expected.OfType<T>();
}

在这种情况下,假设你有一个Person类,它是CopsRobbers的基类。
如果你想从集合中获取所有的"人",你可以写:OfType<Person> 但如果你只想要收集中的强盗,使用OfType<Robbers> 如果你请求一个在expected集合中不存在的类型,比如OfType<Footballer>,会返回一个空的集合。

-1

最好使用LINQ Cast操作符将其转换为所需的IEnumerable。

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

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