Exemplo n.º 1
0
        public static bool TryInvokeObject(ScriptEngine engine, object target, BindingFlags invokeFlags, object[] args, object[] bindArgs, bool tryDynamic, out object result)
        {
            var hostTarget = target as HostTarget;

            if (hostTarget != null)
            {
                if (hostTarget.TryInvoke(engine, invokeFlags, args, bindArgs, out result))
                {
                    return(true);
                }

                if (hostTarget is HostType)
                {
                    return(false);
                }

                target     = hostTarget.InvokeTarget;
                tryDynamic = tryDynamic && typeof(IDynamicMetaObjectProvider).IsAssignableFrom(hostTarget.Type);
            }

            if ((target != null) && invokeFlags.HasFlag(BindingFlags.InvokeMethod))
            {
                var scriptItem = target as ScriptItem;
                if (scriptItem != null)
                {
                    target = DelegateFactory.CreateFunc <object>(scriptItem.Engine, target, args.Length);
                }

                var del = target as Delegate;
                if (del != null)
                {
                    result = InvokeDelegate(engine, del, args);
                    return(true);
                }

                if (tryDynamic)
                {
                    var dynamicMetaObjectProvider = target as IDynamicMetaObjectProvider;
                    if (dynamicMetaObjectProvider != null)
                    {
                        if (dynamicMetaObjectProvider.GetMetaObject(Expression.Constant(target)).TryInvoke(engine, args, out result))
                        {
                            return(true);
                        }
                    }
                }
            }

            result = null;
            return(false);
        }