Nic*_*sen 7 c# lambda unit-testing
我有一个包含一些泛型方法的存储库类.一个是
public IEnumerable<T> FindAll<T>(Expression<Func<T, bool>> predicate) where T : class
{
return GetDbSet<T>().Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
对于单元测试,我有一个TestRepository使用内存中对象而不是数据库.该TestRepository覆盖的FindAll方法,我想控制返回什么.所以我希望能够做到这样的事情:
public override IEnumerable<T> FindAll<T>(Expression<Func<T, bool>> predicate)
{
return MyEntities.Where(predicate).Cast<T>();
}
Run Code Online (Sandbox Code Playgroud)
但MyEntities.Where()只接受一个Expression<Func<MyEntity, bool>>.
如何将通用表达式转换/转换为强类型表达式?
你可以做这样的事情。不确定这是否是一个好主意,但它确实有效。基本上,您的重载可以将类型参数T与实体类进行比较。如果谓词具有正确的类型,则可以进行强制转换。否则,你就没有任何东西可以归还。
public class MyEntity { public int x; }
MyEntity[] MyEntitiesList = Enumerable.Range(1,5).Select(y => new MyEntity() { x = y }).ToArray();
public IEnumerable<T> FindAll<T>(Expression<Func<T, bool>> predicate)
{
if (typeof(T) == typeof(MyEntity))
{
return (IEnumerable<T>)MyEntitiesList.Where((predicate as Expression<Func<MyEntity, bool>>).Compile());
}
return new T[0];
}
Run Code Online (Sandbox Code Playgroud)
用法:
var res = FindAll((MyEntity y) => y.x % 2 == 0).ToList();
Console.WriteLine(res.Count);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1596 次 |
| 最近记录: |