protected override bool TryBindAndInvoke()

in ClearScript/V8/V8ScriptItem.cs [110:194]


        protected override bool TryBindAndInvoke(DynamicMetaObjectBinder binder, object[] args, out object result)
        {
            VerifyNotDisposed();

            try
            {
                if (binder is GetMemberBinder getMemberBinder)
                {
                    result = target.GetProperty(getMemberBinder.Name);
                    return true;
                }

                if ((binder is SetMemberBinder setMemberBinder) && (args != null) && (args.Length > 0))
                {
                    target.SetProperty(setMemberBinder.Name, args[0]);
                    result = args[0];
                    return true;
                }

                if (binder is GetIndexBinder)
                {
                    if ((args != null) && (args.Length == 1))
                    {
                        result = MiscHelpers.TryGetNumericIndex(args[0], out int index) ? target.GetProperty(index) : target.GetProperty(args[0].ToString());
                        return true;
                    }

                    throw new InvalidOperationException("Invalid argument or index count");
                }

                if (binder is SetIndexBinder)
                {
                    if ((args != null) && (args.Length == 2))
                    {
                        if (MiscHelpers.TryGetNumericIndex(args[0], out int index))
                        {
                            target.SetProperty(index, args[1]);
                        }
                        else
                        {
                            target.SetProperty(args[0].ToString(), args[1]);
                        }

                        result = args[1];
                        return true;
                    }

                    throw new InvalidOperationException("Invalid argument or index count");
                }

                if (binder is InvokeBinder)
                {
                    result = target.Invoke(false, args);
                    return true;
                }

                if (binder is InvokeMemberBinder invokeMemberBinder)
                {
                    result = target.InvokeMethod(invokeMemberBinder.Name, args);
                    return true;
                }
            }
            catch (Exception exception)
            {
                if (engine.CurrentScriptFrame != null)
                {
                    if (exception is IScriptEngineException scriptError)
                    {
                        if (scriptError.ExecutionStarted)
                        {
                            throw;
                        }

                        engine.CurrentScriptFrame.ScriptError = scriptError;
                    }
                    else
                    {
                        engine.CurrentScriptFrame.ScriptError = new ScriptEngineException(engine.Name, exception.Message, null, HResult.CLEARSCRIPT_E_SCRIPTITEMEXCEPTION, false, false, null, exception);
                    }
                }
            }

            result = null;
            return false;
        }