c# - 表达式树和编译方法

标签 c# lambda expression-trees

这都是关于 Expression 类型的 Compile 方法。对不起,我来晚了,太天真了。我一直在阅读有关构建表达式以启用可执行代码的动态修改的内容。当涉及到从给定表达式树发出 lambda 表达式时,只要针对不同的输入/环境(比如任何给定常量/参数/成员表达式的不同值),这对我来说是有意义的。我想,如果我可以缓存(重新使用)那些从表达式树生成/编译的 lambda,那将是理想的,前提是环境没有变化。

问题:即使环境没有变化,CLR 是否总是发出 lambda 表达式?如果是这样,最好的办法是在环境没有变化的情况下避免从 lambda 编译表达式?

最佳答案

CLR 不缓存 lambda 表达式,Compile() 每次都返回一个新的委托(delegate)。

但它应该很容易缓存,通过这样的方式:

public Func<T> Get<T>(Expression<Func<T>> expression)
{
    string key = expression.Body.ToString();

    Func<T> result;
    if (!_cache.TryGetValue(key, out result)) {
        result = expression.Compile();
        _cache.Add(key, result);
    }

    return result;
}

关于c# - 表达式树和编译方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150945/

相关文章:

c# - 我将如何对这个 .Net 代码进行单元测试(允许重构)

c# - 使用 Windows 生物识别框架或任何其他方法通过 .Net 访问指纹读取器

java - 我为每个 json 负载都有 DTO。我通过http post请求获取有效负载。我得到两个有效负载,但如何将它们组合成最终有效负载

c# - 编译器错误 : An expression tree may not contain a dynamic operation

c# - 用于打印表达式的库

c# - 如何在字符串中间添加一个符号字符,而不是在 C# 中的字符串开头或结尾

c# - 在不指定类型参数的情况下对泛型类的成员使用 nameof

c# - 替换 lambda 表达式中的参数

java - 静态初始化程序线程锁定中的 Lambda 表达式

c# - 访问表达式主体成员以构建表达式树