Я хочу сгенерировать метод, который будет похож на этот:
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
?