7

いくつかの汎用メソッドを持つリポジトリ クラスがあります。一つは

public IEnumerable<T> FindAll<T>(Expression<Func<T, bool>> predicate) where T : class
{
    return GetDbSet<T>().Where(predicate);
}

単体テストTestRepositoryでは、データベースの代わりにインメモリ オブジェクトを使用します。はメソッドをTestRepositoryオーバーライドし、FindAll返されるものを制御したいと考えています。だから私はこのようなことができるようにしたい:

public override IEnumerable<T> FindAll<T>(Expression<Func<T, bool>> predicate)
{
    return MyEntities.Where(predicate).Cast<T>();
}

ただしMyEntities.Where()、 a のみを受け入れますExpression<Func<MyEntity, bool>>

一般的な式を強く型付けされた式にキャスト/変換するにはどうすればよいですか?

4

2 に答える 2

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];
}

使用法:

var res = FindAll((MyEntity y) => y.x % 2 == 0).ToList();
Console.WriteLine(res.Count);
于 2013-11-15T11:47:47.410 に答える