【问题标题】:Execute/Invoke ConditionalExpression to decided if to use true- or false part执行/调用 ConditionalExpression 来决定是使用真还是假部分
【发布时间】:2016-10-27 18:57:20
【问题描述】:

我希望能够从给定的表达式构建属性名称链。我从这里 (link) 获取了对话的来源。

按照那里的描述使用时效果很好。

我现在的问题是当我传递条件表达式时,例如

Foo((MyClass c) => createChain ? c.SomeProperty : null);

createChainbool 而在Foo 内部,第一个检查是expr != null 更进一步。

但是,expr.Body.NodeType 现在是 ExpressionType.Conditional,我找不到执行/调用表达式的正确方法,所以我知道我应该为 me 设置表达式的哪一部分(真或假)。

我添加了case ExpressionType.Conditional: 并投射了var ce = expr as ConditionalExpression。如何从ce 获得用于me 的正确表达式,因为一个是c.SomeProperty,而另一个是null,具体取决于createChain 的值。

case ExpressionType.Conditional:
    var ce = expr.Body as ConditionalExpression;
    me = (MemberExpression) (ce != null && /*ce.Invoke()*/ ? ce.IfTrue : ce.IfFalse); // here i need to know if to use true or false part of expr
    break;

【问题讨论】:

  • 我觉得这还不够清楚...

标签: c# lambda expression-trees invoke


【解决方案1】:

试试这个:

            case ExpressionType.Conditional:
                var ce = expr.Body as ConditionalExpression;
                var cond = (MemberExpression)ce.Test;
                me = (MemberExpression) (ce != null && (bool)(Expression.Lambda(cond).Compile().DynamicInvoke()) ? ce.IfTrue : ce.IfFalse); 
                break;

【讨论】:

  • 这会抛出InvalidCastException: Unable to cast object of type 'System.Linq.Expressions.FieldExpression' to type 'System.Linq.Expressions.ConstantExpression'.
  • 已更新。尽管如果您的条件表达式计算结果为 null,您可能仍然会遇到问题,因为显然这不会转换为 MemberExpression
  • 谢谢。使用安全转换和检查 null 似乎对我的情况有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 2019-01-21
相关资源
最近更新 更多