我正在为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中获取'封装'类型表达式?
答案 0 :(得分:26)
var typedExpression =
(Func<T, bool>)Expression.Lambda(funcType, itemPredicate, parameter); //Fails
这并不奇怪,因为您需要Compile
一个LambdaExpression
才能获得可以调用的实际委托(Func<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);