You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在项目编译阶段预编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:42:27