Execute/Invoke ConditionalExpression 决定是否使用 true- 或 false 部分
Execute/Invoke ConditionalExpression to decided if to use true- or false part
我希望能够从给定的表达式构建属性名称链。我从这里获取了对话的来源 (link)。
按照那里的描述使用时效果很好。
我现在的问题是当我传递条件表达式时,例如
Foo((MyClass c) => createChain ? c.SomeProperty : null);
而 createChain
是 bool
并且在 Foo
内部,第一个检查是 expr != null
更进一步。
但是,expr.Body.NodeType
现在是 ExpressionType.Conditional
,我找不到 execute/invoke 表达式的正确方法,所以我知道表达式的哪一部分(真或假)应该设置为 me
.
我添加了 case ExpressionType.Conditional:
并投射了 var ce = expr as ConditionalExpression
。我怎样才能从 ce
获得用于 me
的正确表达式,因为一个是 c.SomeProperty
而另一个是 null
取决于 [=12 的值=].
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;
试试这个:
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;
我希望能够从给定的表达式构建属性名称链。我从这里获取了对话的来源 (link)。
按照那里的描述使用时效果很好。
我现在的问题是当我传递条件表达式时,例如
Foo((MyClass c) => createChain ? c.SomeProperty : null);
而 createChain
是 bool
并且在 Foo
内部,第一个检查是 expr != null
更进一步。
但是,expr.Body.NodeType
现在是 ExpressionType.Conditional
,我找不到 execute/invoke 表达式的正确方法,所以我知道表达式的哪一部分(真或假)应该设置为 me
.
我添加了 case ExpressionType.Conditional:
并投射了 var ce = expr as ConditionalExpression
。我怎样才能从 ce
获得用于 me
的正确表达式,因为一个是 c.SomeProperty
而另一个是 null
取决于 [=12 的值=].
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;
试试这个:
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;