编程语言
首页 > 编程语言> > 在C#的运行时构造函数

在C#的运行时构造函数

作者:互联网

Lambda表达式在编译时进行评估,因此以下代码不会生成100个不同的函数.有没有简单的机制可以达到上述效果?我意识到这不是非常有效的性能明智的选择.

List<Action> actions = new List<Action>();
for (int i = 0; i < 100; ++i)
    actions.Add(() => Execute(100100100 + i));

解决方法:

这段代码关闭了一个修改后的变量,因此它不会做您想要做的事情.您需要为i的值添加一个临时变量,如下所示:

List<Action> actions = new List<Action>();
for (int i = 0; i < 100; ++i) {
    int temp = i;
    actions.Add(() => Execute(100100100 + temp));
}

要创建100个单独的Lambda,您可以创建LINQ表达式来调用Execute,一一构建常量,然后编译Lambda.但是,这不太可能给您带来很多性能改进.这是您的操作方式:

var exec = typeof(Test).GetMethod("Execute"); // <<== Use your type here
var actions = new List<Action>();
for (int i = 0 ; i != 100 ; i++) {
    var val = Expression.Constant(i+100100100);
    // This assumes that Execute(int) is static.
    // For non-static calls use a different overload.
    var call = Expression.Call(exec, val);
    var lambda = Expression.Lambda(typeof(Action), call, new ParameterExpression[0]);
    actions.Add((Action)lambda.Compile());
}

Here is a demo on ideone.

标签:compile-time,runtime,c,lambda,anonymous-methods
来源: https://codeday.me/bug/20191030/1968361.html