是否可以将Expression <Func <T,bool >>转换为Expression <Func <MyType,bool >>?

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>>.

如何将通用表达式转换/转换为强类型表达式?

Rob*_*Rob 2

你可以做这样的事情。不确定这是否是一个好主意,但它确实有效。基本上,您的重载可以将类型参数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)