如何将LambdaExpression转换为类型化表达式<func <t,t =“”>&gt; </func <t,>

时间:2013-04-25 11:01:06

标签: c# .net casting lambda linq-expressions

我正在为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中获取'封装'类型表达式?

1 个答案:

答案 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);