在我的代码中,我这样定义 LambaExpression:
Expression<Func<object>> exp = () => myObject.Property;
我需要将它编译成 Func,所以我这样做:
Func<object> compiled = exp.Compile();
由于表达式是在编译时定义的,理论上编译器可以预编译该表达式。
如果表达式是在代码中定义的(不是在运行时构造的),是否可以预编译 LambdaExpression?
我知道编译不能在编译时执行 exp.Compile() ,但是对于给定的代码 'Expression
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()
将返回缓存的函数。
是否可以在项目编译时预编译LambdaExpression?
不。编译器不知道也不可能知道 lambda 引用的对象的确切类型,因为这只能在运行时解析。
我知道编译不能在编译时执行 exp.Compile() ,但是对于给定的代码 'Expression
()=> myObj.Property' 它可以生成 FunccompileExp = () => myObj.Property。
你为什么会这样期望?
我期望编译器会生成访问器参数
你为什么会这样期望?
或者它[编译器]会简单地在内部缓存它
将其缓存在哪里?和仙女们一起?