Beispiel #1
0
        public static List <EvalEvidence> GetEvidence <T>(this IConditionExpression condition, T instance)
        {
            var leafEvaluators = new List <LeafExpression>();

            PopulateLeafFieldEvaluators(condition, leafEvaluators);
            var list = new List <EvalEvidence>();

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

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

                var evidence = new EvalEvidence()
                {
                    Expression = leafExpr,
                    LeftType   = leftType,
                    RightType  = rightType,
                    Actual     = actualObj == null ? null : JToken.FromObject(actualObj),
                    Expected   = JToken.FromObject(expected)
                };
                var getScore = evidence.GetScore <T>();
                evidence.Score = getScore(instance);
                list.Add(evidence);
            }

            return(list);
        }