【问题标题】:How to manually build Expression which will return always true?如何手动构建始终返回 true 的表达式?
【发布时间】:2016-04-21 14:51:17
【问题描述】:

我尝试创建 Expression,但失败了。

我想构建类似Expression<Func<typeof(type), bool>> expression = _ => true;的东西

我的尝试:

private static Expression GetTrueExpression(Type type)
{
    LabelTarget returnTarget = Expression.Label(typeof(bool));
    ParameterExpression parameter = Expression.Parameter(type, "x");

    var resultExpression = 
      Expression.Return(returnTarget, Expression.Constant(true), typeof(bool));

    var delegateType = typeof(Func<,>).MakeGenericType(type, typeof(bool));

    return Expression.Lambda(delegateType, resultExpression, parameter); ;
}

用法:

var predicate = Expression.Lambda(GetTrueExpression(typeof(bool))).Compile();

但我收到错误消息:Cannot jump to undefined label ''

【问题讨论】:

  • 您可以尝试使用阿尔巴哈里兄弟的PredicateBuildervar expr = PredicateBuilder.True&lt;T&gt;();albahari.com/nutshell/predicatebuilder.aspx
  • typeof(type) 在你的表达式中将总是返回Type
  • 这也可以:public static Expression GetTrueExpression&lt;T&gt;() =&gt; Expression&lt;Func&lt;T, bool&gt;&gt;)(x =&gt; true); var predicate = GetTrueExpression&lt;Object&gt;();

标签: c# linq lambda expression-trees


【解决方案1】:

就这么简单:

private static Expression GetTrueExpression(Type type)
{
    return Expression.Lambda(Expression.Constant(true), Expression.Parameter(type, "_"));
}

【讨论】:

    【解决方案2】:

    我不得不面对同样的问题,并得到了这个代码。 看起来很干净,很简单。

    Expression.IsTrue(Expression.Constant(true))
    

    【讨论】:

    • 我不知道。我想是因为我的回答没有带参数。
    • 我猜是因为 OP 正在寻找“可调用的通用函数表达式”,而这只是一个“真”表达式。 Ivan Stoev 的回答很聪明。创建一个表示 lambda 的表达式,当您使用任何类型的参数(只有一个)调用 lambda 表达式时,总是返回 true。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多