1

私のインターフェースでは、次のように定義しています

List<IFoo> GetListOfFoo<T>(Expression<Func<T, bool>> predicate) where T : IFoo;

私の実装では、式を特定の型にキャストします。

if (typeof(T) == typeof(Foo))
{
    Expression converted = Expression.Convert(predicate.Body, typeof(Foo));
    Expression<Func<Foo, bool>> newPredicate = 
        Expression.Lambda<Func<Foo, bool>>(converted, predicate.Parameters);
}

私はこのように私の実装を使用しようとします:

Expression<Func<Foo, bool>> predicate = c => c.Name == "Myname";
_repository.GetListOfFoo<Foo>(predicate);

コンパイル エラーは発生しませんが、これを使用すると、ExpressionBody で bool 引数が定義されているという例外が発生します。

私の問題はどこですか?

4

3 に答える 3

1

あなたのコードは意味がありません。

Expression.Convertを返すを作成し、それFooを を返す関数として使用しようとしていますbool

これExpression.Convertも意味がありません。boolを に変換することはできませんFoo

あなたはおそらく書き込もうとしている

var converted = (Expression<Func<Foo, bool>>) predicate;

Tである限りFoo、これは正常に機能します。

于 2012-05-30T15:26:31.793 に答える
0

私はより良い解決策を見つけました。述語自体をキャストする必要はありません。

public List<IFoo> GetFoos<T>(Expression<Func<T, bool>> predicate) where T : class, IModel 
{
    var result = new List<IFoo>();
    var repository = new Repository<T>();
    result.AddRange(repository.GetEntities(predicate).ToList().ConvertAll(c => (IFoo)c));
    return result;
}
于 2012-05-31T06:18:04.400 に答える
0

式の本体ではなく、パラメーターの型を変更する必要があります。

実装からの呼び出し時に、変換を行う必要があります。

また、なぜこれが必要なのか意味がありませんFoo : IFoo

于 2012-05-30T15:42:17.950 に答える