能否在项目编译阶段预编译LambdaExpression?
代码中定义的LambdaExpression能否预编译?
我在代码里这样定义LambdaExpression:
Expression<Func<object>> exp = () => myObject.Property;
要将它编译为Func的写法如下:
Func<object> compiled = exp.Compile();
既然这个表达式是编译时定义而非运行时构造的,理论上编译器可以对它做预编译处理。我清楚编译器无法在编译阶段直接执行exp.Compile(),但针对Expression<Func<object>> exp = () => myObj.Property这类代码,它完全可以直接生成等价的Func<object> compileExp = () => myObj.Property。
更具体的场景示例
在需要指向类成员以获取元数据(名称、特性等),同时还要获取成员值的场景中,当前写法存在明显问题:
// 问题1:运行时编译导致性能偏低 var param1 = new FormField(() => myObj.Property1); // 问题2:重复编写Lambda,违反DRY原则,冗长且易出错 var param2 = new FormField(() => myObj.Property1, () => myObj.Property1); Console.WriteLine($"{param1.MemberName}: {param1.Value}") class FormField { public FormField( Expression<Func<object>> propertyExpression, Func<object>? accessor = null) { MemberName = ((MemberExpression)propertyExpression.Body).Member.Name; Accessor = accessor ?? propertyExpression.Compile(); } public string MemberName {get; } public Func<object> Accessor {get; } public object Value => Accessor(); }
我期望编译器能自动生成accessor参数,比如可以这样定义构造函数:
public FormField( Expression<Func<object>> propertyExpression, [CallerArgumentExpression("propertyExpression")] Func<object>? accessor = null)
或者编译器内部自动缓存propertyExpression.Compile()的结果,让每次调用都返回同一个预编译好的函数。
内容的提问来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

