24

nHibernate の linq クエリを動的に構築しています。

依存関係があるため、後で型指定された式をキャスト/取得したかったのですが、これまでのところ成功していません。

これは機能していません (キャストは別の場所で行われるはずです):

var funcType = typeof (Func<,>).MakeGenericType(entityType, typeof (bool));
var typedExpression =  (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails

これは機能しています:

var typedExpression = Expression.Lambda<Func<T, bool>>(itemPredicate, parameter);

LambdaExpression から「カプセル化された」型付き式を取得することは可能ですか?

4

1 に答える 1

31
var typedExpression =
    (Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails

呼び出すことができる実際のデリゲートを取得するために必要なため、これは驚くべきことではありません (これが何であるかCompileです) 。LambdaExpressionFunc<T, bool>

したがって、これは機能しますが、必要なものかどうかはわかりません:

// This is no longer an expression and cannot be used with IQueryable
var myDelegate =
    (Func<T, bool>)
    Expression.Lambda(funcType, itemPredicate, parameter).Compile();

式をコンパイルするのではなく、式ツリーを移動することを検討している場合、解決策は代わりににキャストすることExpression<Func<T, bool>>です:

var typedExpression = (Expression<Func<T, bool>>) 
                      Expression.Lambda(funcType, itemPredicate, parameter);
于 2013-04-25T11:09:27.930 に答える