Пример #1
0
        public void Test4()
        {
            var model = new InnerTestModel
            {
                AA     = "测试",
                BB     = 111,
                Model2 = new InnerTestModel2 {
                    TTT = "hao"
                },
                Models = new[] {
                    new InnerTestModel2 {
                        TTT = "111"
                    },
                    new InnerTestModel2 {
                        TTT = "222"
                    }
                }
            };

            Expression <Func <InnerTestModel, object> > expression = obj => obj.Models[1].TTT;

            AssignNewValue(model, expression, "new-111");

            Assert.AreEqual(model.Models[1].TTT, "new-111");
        }
Пример #2
0
        public void Test2()
        {
            var model = new InnerTestModel
            {
                AA     = "测试",
                BB     = 111,
                Model2 = new InnerTestModel2 {
                    TTT = "hao"
                }
            };

            var aaGetter = ExpressionUtil.GetPropGetter <InnerTestModel, string>(t => t.AA);
            var aaSetter = ExpressionUtil.GetPropSetter <InnerTestModel, string>(t => t.AA);

            var bbGetter = ExpressionUtil.GetPropGetter <InnerTestModel, int>(t => t.BB);
            var bbSetter = ExpressionUtil.GetPropSetter <InnerTestModel, int>(t => t.BB);

            var aa1 = aaGetter(model);

            Assert.AreEqual(aa1, "测试");

            aaSetter(model, "测试2");
            var aa2 = aaGetter(model);

            Assert.AreEqual(aa2, "测试2");

            var bb1 = bbGetter(model);

            Assert.AreEqual(bb1, 111);

            bbSetter(model, 2222);
            var bb2 = bbGetter(model);

            Assert.AreEqual(bb2, 2222);

            var ccGetter = ExpressionUtil.GetPropGetter <InnerTestModel, object>(t => t.Model2);
            var ccSetter = ExpressionUtil.GetPropSetter <InnerTestModel>(t => t.Model2);

            var cc1 = ccGetter(model);

            Assert.IsNotNull(cc1);
            ccSetter(model, null);
            Assert.IsNull(model.Model2);

            ccSetter(model, new InnerTestModel2 {
                TTT = "bbbbb"
            });
            Assert.IsNotNull(model.Model2);
        }
Пример #3
0
        private static void AssignNewValue(InnerTestModel obj, Expression <Func <InnerTestModel, object> > expression, object value)
        {
            var valueParameterExpression = Expression.Parameter(typeof(object));
            var targetExpression         = expression.Body is UnaryExpression ? ((UnaryExpression)expression.Body).Operand : expression.Body;

            var newValue = Expression.Parameter(expression.Body.Type);
            var assign   = Expression.Lambda <Action <InnerTestModel, object> >
                           (
                Expression.Assign(targetExpression, Expression.Convert(valueParameterExpression, targetExpression.Type)),
                expression.Parameters.Single(),
                valueParameterExpression
                           );

            assign.Compile().Invoke(obj, value);
        }
Пример #4
0
        public void Test3()
        {
            var model = new InnerTestModel
            {
                AA     = "测试",
                BB     = 111,
                Model2 = new InnerTestModel2 {
                    TTT = "hao"
                }
            };

            Expression <Func <InnerTestModel, object> > member = m => m.Model2;
            var memberBody = member.Body as MemberExpression;
            var propInfo   = (PropertyInfo)memberBody.Member;
            var lambda     = Expression.Lambda <Action <InnerTestModel> >(Expression.Assign(memberBody,
                                                                                            Expression.Convert(Expression.Constant(null), propInfo.PropertyType)), member.Parameters);
            var action = lambda.Compile();

            action(model);

            Assert.IsNull(model.Model2);
        }
Пример #5
0
 public TestModel()
 {
     InnerModel = new InnerTestModel();
 }
Пример #6
0
 public TestModel()
 {
     InnerModel = new InnerTestModel();
 }