public static bool TryBindAndInvoke()

in ClearScript/Util/DynamicHelpers.cs [39:126]


        public static bool TryBindAndInvoke(DynamicMetaObjectBinder binder, object target, object[] args, out object result)
        {
            try
            {
                // For COM member access, use IReflect/IExpando if possible. This works around
                // some dynamic binder bugs and limitations observed during batch test runs.

                if ((target is IReflect reflect) && reflect.GetType().IsCOMObject)
                {
                    if (binder is GetMemberBinder getMemberBinder)
                    {
                        if (TryGetProperty(reflect, getMemberBinder.Name, getMemberBinder.IgnoreCase, args, out result))
                        {
                            return true;
                        }
                    }
                    else
                    {
                        if (binder is SetMemberBinder setMemberBinder)
                        {
                            if (TrySetProperty(reflect, setMemberBinder.Name, setMemberBinder.IgnoreCase, args, out result))
                            {
                                return true;
                            }
                        }
                        else
                        {
                            if (binder is CreateInstanceBinder)
                            {
                                if (TryCreateInstance(reflect, args, out result))
                                {
                                    return true;
                                }
                            }
                            else
                            {
                                if (binder is InvokeBinder)
                                {
                                    if (TryInvoke(reflect, args, out result))
                                    {
                                        return true;
                                    }
                                }
                                else
                                {
                                    if (binder is InvokeMemberBinder invokeMemberBinder)
                                    {
                                        if (TryInvokeMethod(reflect, invokeMemberBinder.Name, invokeMemberBinder.IgnoreCase, args, out result))
                                        {
                                            return true;
                                        }
                                    }
                                    else if ((args != null) && (args.Length > 0))
                                    {
                                        if (binder is GetIndexBinder)
                                        {
                                            if (TryGetProperty(reflect, args[0].ToString(), false, args.Skip(1).ToArray(), out result))
                                            {
                                                return true;
                                            }
                                        }
                                        else
                                        {
                                            if (binder is SetIndexBinder)
                                            {
                                                if (TrySetProperty(reflect, args[0].ToString(), false, args.Skip(1).ToArray(), out result))
                                                {
                                                    return true;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                var binding = Bind(binder, target, args);
                result = Invoke(binding.Expression);
                return true;
            }
            catch (Exception exception)
            {
                result = exception;
                return false;
            }
        }