private void ExtractInvocation(ParameterExpression command, ParameterExpression annotator, MethodCallExpression invex)
        {
            if (invex.Object == annotator)
            {
                if (invex.Method == AnnotatorMethods.AssertionsMethod)
                {
                    var conv = Expression.Convert(invex.Arguments[0], typeof(object));
                    var lamb = Expression.Lambda(conv, command);
                    var le   = lamb.Compile();
                    var cA   = new AssertionCheckParameter()
                    {
                        Extractor = le,
                        Type      = invex.Arguments[0].Type
                    };
                    _checkParameters.Add(cA);
                    return;
                }
            }

            var lambda = Expression.Lambda(invex, command).Compile();
            var cC     = new CommandExtractCheckParameter()
            {
                Type      = invex.Type,
                Extractor = lambda
            };

            _checkParameters.Add(cC);
        }
        private ExpressionSyntax MakeAssertions(CommandBase command, AssertionCheckParameter cecp)
        {
            var value = cecp.Extractor.DynamicInvoke(command);

            var          statements = new Stack <StatementSyntax>();
            const string varName    = "x";

            statements.Push(ReturnStatement(LiteralExpression(SyntaxKind.TrueLiteralExpression)));
            if (value == null)
            {
                statements.Push(IfReturnFalse(IdentifierName(varName), LiteralExpression(SyntaxKind.NullLiteralExpression)));
            }
            else
            {
                var tp = value.GetType();
                if (tp.IsInlineable())
                {
                    var v = TypeInitConstructor.Construct(tp, value);
                    statements.Push(IfReturnFalse(IdentifierName(varName), v));
                }
                else
                {
                    var assertProps = cecp.PropertiesToAssert;
                    if (assertProps == null || assertProps.Length == 0)
                    {
                        assertProps =
                            tp.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
                    }

                    var props = assertProps
                                .Where(x => x.PropertyType.IsInlineable());
                    foreach (var propertyInfo in props)
                    {
                        var access = MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
                                                            IdentifierName(varName), IdentifierName(propertyInfo.Name));
                        var propValue    = propertyInfo.GetValue(value);
                        var inlinedValue = TypeInitConstructor.Construct(propertyInfo.PropertyType, propValue);

                        statements.Push(IfReturnFalse(access, inlinedValue));
                    }
                }
            }

            var blk = Block(List(statements));

            var lambda = SimpleLambdaExpression(Parameter(Identifier(varName)), blk);

            return(lambda);
        }