使用Expression.Block编译的委托继续抛出NullReferenceException

Ste*_*ven 0 .net c# lambda expression .net-4.0

我正在尝试构建一个为给定对象分配多个属性的Expression,但是在调用已编译的委托之后,它会继续NullReferenceException在lambda体内抛出一个:

var a = Expression.Parameter(typeof(A), "a");
var b = Expression.Parameter(typeof(B), "b");
var c = Expression.Parameter(typeof(C), "c");

LabelTarget returnTarget = Expression.Label(typeof(A));
GotoExpression returnExpression =
    Expression.Return(returnTarget, a, typeof(A));
LabelExpression returnLabel = Expression.Label(
    returnTarget, Expression.Constant(null, typeof(A)));

var expression = Expression.Lambda<Func<A, B, C, A>>(
    Expression.Block(
        typeof(A),
        new[] { a, b, c },
        Expression.Assign(
            Expression.Property(a, typeof(A).GetProperty("B")),
            b),
        Expression.Assign(
            Expression.Property(a, typeof(A).GetProperty("C")),
            c),
        returnExpression,
        returnLabel
    ), 
    a, b, c);

Func<A, B, C, A> func = expression.Compile();

// Calling func throws a NullReferenceException
A result = func(new A(), new B(), new C());
Run Code Online (Sandbox Code Playgroud)

我假设我Expression.Block写错了,但我到底做错了什么呢?

Jea*_*nal 5

你应该更换线路

new[] { a, b, c },
Run Code Online (Sandbox Code Playgroud)

new ParameterExpression[] {},
Run Code Online (Sandbox Code Playgroud)

第二个参数Expression.Block应该定义块范围的变量 - 但是你已经在最后一个参数中提供了参数a,b和c作为函数级参数Expression.Lambda.