using System.Linq.Expressions; namespace YLErp.BasicTests { [TestClass] public class LinqExpressionTest { [TestMethod] public void TestAddAssign() { var data = new LinqData { N1 = 3 }; Expression> propExp = n => n.N1; var pinvoke = Expression.Invoke(propExp, propExp.Parameters); var addExp = Expression.Add(pinvoke, Expression.Constant(2d, typeof(double))); var assign = Expression.Assign(propExp.Body, addExp); var action = Expression.Lambda>(assign, propExp.Parameters).Compile(); action(data); Assert.AreEqual(data.N1, 5); var data2 = new LinqData { N1 = 3 }; var assign2 = Expression.AddAssign(propExp.Body, Expression.Constant(3d, typeof(double))); var action2 = Expression.Lambda>(assign2, propExp.Parameters).Compile(); action2(data2); Assert.AreEqual(data2.N1, 6); } [TestMethod] public void TestMultiplyAssign() { var data = new LinqData { N1 = 3 }; Expression> propExp = n => n.N1; var pinvoke = Expression.Invoke(propExp, propExp.Parameters); var multiply = Expression.Multiply(pinvoke, Expression.Constant(1 + 0.2, typeof(double))); var assign = Expression.Assign(propExp.Body, multiply); var action = Expression.Lambda>(assign, propExp.Parameters).Compile(); action(data); Assert.AreEqual(data.N1, 3.6, 1e-4); var data2 = new LinqData { N1 = 3 }; var assign2 = Expression.MultiplyAssign(propExp.Body, Expression.Constant(1.5, typeof(double))); var action2 = Expression.Lambda>(assign2, propExp.Parameters).Compile(); action2(data2); Assert.AreEqual(data2.N1, 4.5, 1e-4); } class LinqData { public double N1 { get; set; } } } }