gpt4 book ai didi

c# - 已编译的 Dynamic Linq Func<> *没有*参数的缓存委托(delegate)?

转载 作者:行者123 更新时间:2023-11-30 16:33:19 24 4
gpt4 key购买 nike

我正在使用 Dynamic LINQ 库中的 Dynamic.ParseLambda 方法创建表达式,将每个表达式编译为 Func<>,并将每个缓存在字典中:

// parse some dynamic expression using this ParseLambda sig:
Expression<Func<TArgument,TResult>> funcExpr =
System.Linq.Dynamic.ParseLambda<TArgument, TResult>(
expressionString, // string for dyn lambda expression
parameters); // object[] params

// then compile & cache the output of this as a delegate:
Func<TArgument,TResult> func = funcExpr.Compile(); //<-cache this

// then to execute, use:
return func(entityInstance);

问题是,这迫使我为每组不同的参数值缓存不同的委托(delegate)实例。这似乎有点浪费; Dynamic LINQ 的所有开销都在解析和编译中;一旦创建,代表在性能上接近于直接编码的 lambda。有没有什么方法可以将参数移到表达式之外,这样我就可以在调用它时(而不是在创建它时)将不同的值传递给一个通用的缓存委托(delegate)?

// e.g. with params...
return func(entityInstance,parameters);

// or if params are the issue, multiple signatures are ok:
return func(entityInstance, intValue, stringValue);

我在 System.Linq.Dynamic 中没有看到任何无参数的 .ParseLambda 或 .Compile 签名,所以我的希望并不高。有人知道实现此目标的快速方法吗?

谢谢!

最佳答案

这里有一个技巧,我以前用过;你做了类似 Expression<Func<object[], object>> 的事情, 并将按索引获取和强制转换 inside 表达式。然后,您将拥有尽可能多的参数、单个签名和合理的性能。但是,它确实让编写 lambda 变得有点棘手。

我没有“手头”的旧代码,但如果我需要对其进行逆向工程,我会简单地编写一些典型的代码,如下所示,然后查看反射器以查看它使用了什么:

Expression<Func<object[], object>> func = arr => ((string)arr[0]) + (int)arr[1];

(尤其要注意索引器的使用、从输入进行的转换,以及向输出的转换)

关于c# - 已编译的 Dynamic Linq Func<> *没有*参数的缓存委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3338859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com