在C#开发中,表达式树(Expression Tree)是一种强大的工具,尤其在动态构建查询、ORM框架(如Entity Framework)或反射替代方案中被广泛使用。然而,频繁创建和编译表达式树会带来显著的性能开销。因此,C#表达式树缓存和表达式树复用成为提升应用性能的关键技术。
本文将从零开始,手把手教你如何实现表达式树的缓存机制,即使是编程小白也能轻松掌握!
表达式树是一种以树形结构表示代码的数据结构。例如,x => x.Name == "张三" 这样的Lambda表达式可以被转换为表达式树,供运行时分析或转换为SQL等其他语言。

每次使用 Expression.Lambda(...).Compile() 都会生成一个新的委托(Delegate),这个过程涉及JIT编译,开销较大。如果在循环或高频调用场景中重复创建相同的表达式树,会导致严重的性能瓶颈。
通过Expression Tree性能优化中的缓存策略,我们可以避免重复编译,显著提升程序效率。
下面我们将使用 ConcurrentDictionary 来缓存已编译的委托。假设我们要动态获取对象的属性值:
using System;using System.Collections.Concurrent;using System.Linq.Expressions;using System.Reflection;public static class PropertyGetterCache{ // 使用 ConcurrentDictionary 线程安全地缓存委托 private static readonly ConcurrentDictionary<string, Func<object, object>> _cache = new ConcurrentDictionary<string, Func<object, object>>(); public static Func<object, object> GetGetter(Type type, string propertyName) { string key = $"{type.FullName}.{propertyName}"; return _cache.GetOrAdd(key, k => { // 构建表达式树:obj => ((T)obj).PropertyName var param = Expression.Parameter(typeof(object), "obj"); var cast = Expression.Convert(param, type); var property = Expression.Property(cast, propertyName); var convert = Expression.Convert(property, typeof(object)); var lambda = Expression.Lambda<Func<object, object>>(convert, param); return lambda.Compile(); }); }}下面是一个使用示例:
public class Person{ public string Name { get; set; }}// 使用缓存获取属性值var person = new Person { Name = "李四" };var getter = PropertyGetterCache.GetGetter(typeof(Person), "Name");var name = getter(person); // 返回 "李四"// 再次调用相同类型和属性名,直接从缓存读取,无需重新编译var getter2 = PropertyGetterCache.GetGetter(typeof(Person), "Name");Console.WriteLine(ReferenceEquals(getter, getter2)); // 输出 True为了进一步提升类型安全性,可以使用泛型静态类实现“每个类型一个缓存”:
public static class PropertyGetterCache<T>{ private static readonly ConcurrentDictionary<string, Func<T, object>> _cache = new ConcurrentDictionary<string, Func<T, object>>(); public static Func<T, object> GetGetter(string propertyName) { return _cache.GetOrAdd(propertyName, name => { var param = Expression.Parameter(typeof(T), "obj"); var property = Expression.Property(param, name); var convert = Expression.Convert(property, typeof(object)); var lambda = Expression.Lambda<Func<T, object>>(convert, param); return lambda.Compile(); }); }}通过合理使用 C#表达式树缓存 和 表达式树复用 技术,我们可以在保持代码灵活性的同时,大幅提升应用程序性能。这种 C#高性能编程 的实践,特别适用于数据映射、序列化、动态查询等场景。
记住:不要在高频路径上重复编译表达式树!利用缓存,让 Expression Tree性能优化 成为你开发利器。
希望这篇教程能帮助你掌握表达式树缓存的核心思想。动手试试吧,你的程序会感谢你!
本文由主机测评网于2025-12-14发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025127576.html