在另一个动态表达式的回退中创建动态表达式是否安全?

本文关键字:表达式 动态 是否 安全 创建 回退 另一个 | 更新日期: 2023-09-27 18:30:33

标题在这个标题上是不言自明的。

澄清一下:我已经使用动态表达式构建了一个非常完整的语言基础结构,并认为尝试输出程序集会很酷。任何有经验的人都知道"LambdaExpression.CompileToMethod"需要将动态表达式转换为 CallSite<>并将其分配给表达式稍后可以访问的私有字段。

我已经在一些测试项目中成功地做到了这一点,但是在我(再次)重构所有(我的意思是所有)我的代码之前,我需要知道我是否必须对在回退过程中创建的绑定器实例执行相同的操作。

protected override void FallbackInvoke(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) { 
    // If I make a DynamicExpression here, does it need to be a CallSite<> ? 
    // Or since it's inside the context of an executing delegate (CallSite<>), 
    // is it considered "Live" ? 
} 

此外,使用"Expression.Constant"在编译为方法时也有局限性。该限制是否也存在于活页夹内部,或者是否被认为是"运行时"和"安全"。

在另一个动态表达式的回退中创建动态表达式是否安全?

好吧,经过一些测试。是的,它是安全的。在回退期间创建的动态表达式不必转换为 CallSite<>。但是,应该注意的是,原始表达式中的所有动态表达式都是如此。