예제 #1
0
        private JArray GetEvidence <T>(IConditionExpression condition, T instance)
        {
            var leafEvaluators = new List <LeafExpression>();

            condition.PopulateLeafFieldEvaluators(leafEvaluators);
            var array = new JArray();

            foreach (var leafExpr in leafEvaluators)
            {
                var ctxParameter   = Expression.Parameter(typeof(T), "ctx");
                var leftExpression = ctxParameter.EvaluateExpression(leafExpr.Left);
                var lambda         = Expression.Lambda(leftExpression, ctxParameter);
                var getValue       = lambda.Compile();
                var actualObj      = getValue.DynamicInvoke(instance);

                string expected = leafExpr.Right;
                if (leafExpr.RightSideIsExpression)
                {
                    var rightExpression = ctxParameter.EvaluateExpression(leafExpr.Right);
                    lambda   = Expression.Lambda(rightExpression, ctxParameter);
                    getValue = lambda.Compile();
                    var expectedObj = getValue.DynamicInvoke(instance);
                    expected = JsonConvert.SerializeObject(expectedObj);
                }

                var evidence = new
                {
                    left   = leafExpr.Left,
                    op     = leafExpr.Operator.ToString(),
                    actual = actualObj,
                    expected
                };
                array.Add(JToken.FromObject(evidence));
            }

            return(array);
        }