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); }