Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以为动态if语句创建表达式树?_C#_Lambda - Fatal编程技术网

C# 是否可以为动态if语句创建表达式树?

C# 是否可以为动态if语句创建表达式树?,c#,lambda,C#,Lambda,我有一个场景,在那里我阅读业务逻辑,用实际值替换变量,然后我需要对其进行评估以得到结果。我目前正在使用bcParser来做这件事,它可以很好地用于所有像excel格式一样编写的逻辑 向我抛出的曲线球是,if条件将不像excelif(cond,true,false)而是像C#,其中的if(cond){true;}或者{false;},这更有意义并且易于维护。因为我用前面的值替换了所有变量,所以我所要做的就是计算它。目前,我通过将逻辑导出到c#方法并使用反射来解决这个问题,我正在对其进行评估,它也可

我有一个场景,在那里我阅读业务逻辑,用实际值替换变量,然后我需要对其进行评估以得到结果。我目前正在使用bcParser来做这件事,它可以很好地用于所有像excel格式一样编写的逻辑

向我抛出的曲线球是,if条件将不像excel
if(cond,true,false)
而是像C#,其中的
if(cond){true;}或者{false;}
,这更有意义并且易于维护。因为我用前面的值替换了所有变量,所以我所要做的就是计算它。目前,我通过将逻辑导出到c#方法并使用反射来解决这个问题,我正在对其进行评估,它也可以工作

我想知道是否还有其他选择,我不想为每个if条件编写代码,而是希望在运行时对其进行评估。我想知道我是否能够创建某种令牌解析器,调用C#native expression evalution并执行计算。我还没有深入了解表达式树,似乎用这种方法是可能的。在我去那里之前,我想知道这有可能吗? 谢谢,是的

关键是使用
System.Linq.Expressions
名称空间。您可以在代码中或通过修改解析器以编程方式构建表达式树,然后将其编译为
委托
。此API在
动态合理地
内部编译您的
委托
,这意味着当您完全取消引用编译后的表达式时,垃圾收集器可以从内存中卸载它们

下面是一个非常简单的例子:

var b = true;
Func<bool> condition = () => b;
Action trueExpression = () => { Console.WriteLine(true); };
Action falseExpression = () => { Console.WriteLine(false); };

var e = Expression.Condition(
    Expression.Invoke(Expression.Constant(condition)),
    Expression.Invoke(Expression.Constant(trueExpression)),
    Expression.Invoke(Expression.Constant(falseExpression)));

var λ = Expression.Lambda(e).Compile();

b = true;
λ.DynamicInvoke();

b = false;
λ.DynamicInvoke();
将表达式编译成Lambda的步骤可能会对性能造成重大影响,您需要为已编译的Lambda提供缓存策略。不过,使用DynamicVoke调用已编译的lambda非常快,这是值得的。几乎和您预先编译它一样快。这种技术比使用CodeDom代码生成(需要一个完整的另一个过程来编译)要快得多,并且它的主要优点是生成不可加载的程序集


唯一的限制是不能使用此API创建类型。你必须把自己局限于表达和陈述。但是,它非常强大,这是DLR的魔力所在。

表达式树不会帮助您解析字符串。您可能想看看或。如何获得lambda符号?希望
True
False