Ejemplo n.º 1
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (base.TryInvokeMember(binder, args, out result))
            {
                return(true);
            }

            if (_dataStrategy != null)
            {
                // Probably a table...
                var table = new DynamicTable(_name, _dataStrategy);
                if (table.TryInvokeMember(binder, args, out result))
                {
                    _dataStrategy.SetMemberAsTable(this, table);
                    return(true);
                }

                // Or it could be a schema reference...
                var schema = new DynamicSchema(_name, _dataStrategy);
                if (schema.TryInvokeMember(binder, args, out result))
                {
                    _dataStrategy.SetMemberAsSchema(this);
                    return(true);
                }
            }

            var dataStrategy = FindDataStrategyInHierarchy();

            if (dataStrategy != null)
            {
                var command = CommandFactory.GetCommandFor(binder.Name);
                if (command != null)
                {
                    var schema = dataStrategy.SetMemberAsSchema(_owner);
                    var table  = schema.GetTable(_name);
                    result = command.Execute(dataStrategy, table, binder, args);
                }
                else
                {
                    if (dataStrategy.IsExpressionFunction(binder.Name, args))
                    {
                        result = new SimpleExpression(this, new SimpleFunction(binder.Name, args), SimpleExpressionType.Function);
                    }
                    else
                    {
                        result = new FunctionReference(binder.Name, this, args);
                    }
                }
                return(true);
            }
            throw new InvalidOperationException();
        }
Ejemplo n.º 2
0
 public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
 {
     if (_database != null)
     {
         var table = _database.SetMemberAsTable(this);
         return(table.TryInvokeMember(binder, args, out result));
     }
     if ((!ReferenceEquals(_owner, null)) && GetOwner().GetDatabase() != null)
     {
         var command = CommandFactory.GetCommandFor(binder.Name);
         if (command != null)
         {
             var schema = _owner._database.SetMemberAsSchema(_owner);
             var table  = schema.GetTable(_name);
             result = command.Execute(_database ?? _owner._database, table, binder, args);
         }
         else
         {
             result = new SimpleExpression(this, new SimpleFunction(binder.Name, args), SimpleExpressionType.Function);
         }
         return(true);
     }
     throw new InvalidOperationException();
 }
Ejemplo n.º 3
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (base.TryInvokeMember(binder, args, out result))
            {
                return(true);
            }

            if (_dataStrategy != null)
            {
                var table = new DynamicTable(_name, _dataStrategy);
                try
                {
                    if (table.TryInvokeMember(binder, args, out result))
                    {
                        _dataStrategy.SetMemberAsTable(this, table);
                        return(true);
                    }
                }
                catch (InvalidOperationException ex)
                {
                    if (!ex.Message.StartsWith("Method"))
                    {
                        throw;
                    }
                }

                // Or it could be a schema reference...
                var schema = new DynamicSchema(_name, _dataStrategy);
                try
                {
                    if (schema.TryInvokeMember(binder, args, out result))
                    {
                        _dataStrategy.SetMemberAsSchema(this);
                        return(true);
                    }
                }
                catch (KeyNotFoundException)
                {
                    throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name));
                }
            }

            var dataStrategy = FindDataStrategyInHierarchy();

            if (dataStrategy != null)
            {
                var command = CommandFactory.GetCommandFor(binder.Name);
                if (command != null)
                {
                    if (!ReferenceEquals(_owner, null))
                    {
                        var schema = dataStrategy.SetMemberAsSchema(_owner);
                        var table  = schema.GetTable(_name);
                        table.TryInvokeMember(binder, args, out result);
                    }
                    else
                    {
                        throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name));
                    }
                    //result = command.Execute(dataStrategy, table, binder, args);
                }
                else
                {
                    if (dataStrategy.IsExpressionFunction(binder.Name, args))
                    {
                        result = new SimpleExpression(this, new SimpleFunction(binder.Name, args), SimpleExpressionType.Function);
                    }
                    else
                    {
                        result = new FunctionReference(binder.Name, this, args);
                    }
                }
                return(true);
            }
            throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name));
        }