是否可以在项目编译时预编译LambdaExpression?

问题描述 投票:0回答:1

在我的代码中,我这样定义 LambaExpression:

Expression<Func<object>> exp = () => myObject.Property;

我需要将它编译成 Func,所以我这样做:

Func<object> compiled = exp.Compile();

由于表达式是在编译时定义的,理论上编译器可以预编译该表达式。

如果表达式是在代码中定义的(不是在运行时构造的),是否可以预编译 LambdaExpression?

我知道编译不能在编译时执行 exp.Compile() ,但是对于给定的代码 'Expression ()=> myObj.Property' 它可以生成

Func<object> compileExp = () => myObj.Property
.


更具体的例子

任何场景,当您需要在代码中指向类成员以获取一些元数据(名称、属性等)并获取其值时。

// Slow because of runtime compilation
var param1 = new FormField(() => myObj.Property1); 

// Verbose and prone to errors due DRY violation 
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()
将返回缓存的函数。

c# lambda
1个回答
0
投票

是否可以在项目编译时预编译LambdaExpression?

不。编译器不知道也不可能知道 lambda 引用的对象的确切类型,因为这只能在运行时解析。

我知道编译不能在编译时执行 exp.Compile() ,但是对于给定的代码 'Expression ()=> myObj.Property' 它可以生成 FunccompileExp = () => myObj.Property。

你为什么会这样期望?

我期望编译器会生成访问器参数

你为什么会这样期望?

或者它[编译器]会简单地在内部缓存它

将其缓存在哪里?和仙女们一起?

© www.soinside.com 2019 - 2024. All rights reserved.