2016-01-12 79 views
2

如何将expected作为IEnumerable<T>给出下面的代码?如何将列表<object>转换为IEnumerable <T>

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

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

(这是在单元测试中创建嘲笑实体框架SqlQuery<T>方法的类,我们可以提前设定的时间我们预期的结果,并且根本就还给你所期待的。)

+0

为什么'expected'是一个字段,而不是'List '类型的局部变量? –

+1

@MichaelLiu这是一个为单元测试创​​建的模拟EF SqlQuery类的类。我们可以提前设定我们的预期结果,并且简单地返回您期望的结果。 – user3953989

+1

'return expected.Select(e => e.Cast ());'? –

回答

8

假设expected确实包含T类型的实例,你可以使用LINQ Cast操作:

如果转换为任何ELEM失败
public IEnumerable<T> SqlQuery<T>(string sql) 
{ 
    return expected.Cast<T>(); 
} 

InvalidCastException的将被抛出ENT。

+0

工作完美,谢谢! – user3953989

+0

如果真的那么为什么不使用'OfType'会更安全? –

+5

@VadimMartynov:我认为如果在单元测试中存在缺陷,而不是默默地忽略坏元素,最好炸掉它。 –

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>(); 
} 
相关问题