Как я могу изменить поле внутри Expression? - PullRequest
0 голосов
/ 09 мая 2018

Я хочу сгенерировать метод, который будет похож на этот:

void Add(ref MyStruct a, MyStruct b)
{
    a.Field1 += b.Field1;
    // a.Field2 += b.Field2; // and so on
}

Для этого я объявил мой пользовательский делегат:

public delegate void Add<T>(ref T a, T b) where T : struct;

и напишите мой строитель выражений:

public static Expression<Add<T>> BuildExpression<T>() where T : struct
{
    var t = typeof(T);
    var a = Expression.Parameter(t.MakeByRefType(), "a");
    var b = Expression.Parameter(t, "b");

    return Expression.Lambda<Add<T>>(
        Expression.Block(
            t.GetFields().Select(f => 
                Expression.AddAssign(Expression.Field(a, f), Expression.Field(b, f)))),
        a, b
      );
}

Я добавил MyStruct с одним полем Field1, чтобы проверить его. Когда я проверяю DebugView моего выражения, оно выглядит очень похоже на ожидаемый результат:

.Lambda #Lambda1<Program+Add`1[Program+MyStruct]>(
    Program+MyStruct& $a,
    Program+MyStruct $b) {
    .Block() {
        $a.Field1 += $b.Field1
    }
}

однако это не изменяет первый аргумент. Пожалуйста, смотрите демо

Так что же я делаю не так в моем BuildExpression?

...