[使用AsParallel-表达式树进行C#包装数组初始化

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

如何使用ParallelEnumerable.AsParallel包装NewArrayExpression?

例如,我有Expression代表下一个代码:

var data = new int {1, 2, 3, 4, 5};

我想要得到的结果:

var data = new int {1, 2, 3, 4, 5}.AsParallel();

我尝试使用ExpressionVisitor和VisitNewArray方法:

    protected override Expression VisitNewArray(NewArrayExpression node)
    {

            var source = Expression.Parameter(typeof(IEnumerable<>).MakeGenericType(typeof(MethodCallExpression)), "source");

            var asParallel =
                Expression.Call(
                    typeof(ParallelEnumerable),
                    nameof(ParallelEnumerable.AsParallel),
                    new[] { typeof(ParallelQuery<MethodCallExpression>) },
                    source
                );

            return ***???***
    }

但是不知道如何纠正“包装” node.ExpressionsExpression.Call

谢谢您的建议!

c# expression expression-trees
1个回答
0
投票

这样做会将表达式类型从T[]更改为ParallelQuery<T>,这可能会引起问题。

但是回答您的具体问题。让我们重写您的示例

var data = new int[] {1, 2, 3, 4, 5}.AsParallel();

如下

var newArray = new int[] { 1, 2, 3, 4, 5 };
var data = newArray.AsParallel();

现在考虑到AsParallel是通用静态扩展方法,删除编译器糖后的实际调用是

var data = ParallelEnumerable.AsParallel<int>(newArray);

换句话说,调用通用静态方法,将数组元素类型作为通用类型参数,将new数组表达式作为参数。例如

protected override Expression VisitNewArray(NewArrayExpression node)
{
    var asParallel = Expression.Call(
        typeof(ParallelEnumerable),
        nameof(ParallelEnumerable.AsParallel),
        new [] { node.Type.GetElementType() },
        node
    );
    return asParallel;
}
© www.soinside.com 2019 - 2024. All rights reserved.