/// <summary>
        /// Invokes a method using a bundle to find the appropriate
        /// invocation parameters.
        /// </summary>
        /// <param name="controller"></param>
        /// <param name="methodInfo"></param>
        /// <param name="bundle"></param>
        public static void InvokeMethodWithBundle(this IMvxController controller, MethodInfo methodInfo, IMvxBundle bundle)
        {
            if (bundle.Data.Count == 0)
            {
                return;
            }

            ParameterInfo[] parameterInfoArray = methodInfo.GetParameters();

            if (parameterInfoArray.Length == 1 && parameterInfoArray[0].ParameterType == typeof(IMvxBundle))
            {
                //Method accepts bundle directly as parameter.
                methodInfo.Invoke(controller, new object[]
                {
                    bundle
                });
            }
            else if (parameterInfoArray.Length == 1 &&
                     !MvxSingleton <IMvxSingletonCache> .Instance.Parser.TypeSupported(parameterInfoArray[0].ParameterType))
            {
                //Single parameter is an aggregate type that the bundle can deserialize
                object obj = bundle.Read(parameterInfoArray[0].ParameterType);
                methodInfo.Invoke(controller, new[]
                {
                    obj
                });
            }
            else
            {
                //Bundle is an argument list.
                object[] parameters = bundle.CreateArgumentList(parameterInfoArray, controller.GetType().Name).ToArray();
                methodInfo.Invoke(controller, parameters);
            }
        }
Esempio n. 2
0
        public void AttachController(IMvxController controller)
        {
            if (Controller != null)
            {
                throw new InvalidOperationException("Controller has already been associated with this view model.");
            }

            Controller = controller;
        }
        public void AttachController(IMvxController controller)
        {
            if (Controller != null)
            {
                throw new InvalidOperationException("Controller has already been associated with this view model.");
            }

            Controller = controller;
        }
        /// <summary>
        /// Attempts to invoke methods matching a given name
        /// on a controller using
        /// a IMvxBundle parameter
        /// </summary>
        /// <param name="controller"></param>
        /// <param name="methodName"></param>
        /// <param name="bundle"></param>
        public static void InvokeMethodsWithBundle(this IMvxController controller, string methodName, IMvxBundle bundle)
        {
            var methods = controller.GetType()
                          .GetTypeInfo()
                          .DeclaredMethods.Where(m => m.Name == methodName)
                          .Where(m => !m.IsAbstract)
            ;

            foreach (MethodInfo methodInfo in methods)
            {
                controller.InvokeMethodWithBundle(methodInfo, bundle);
            }
        }
        /// <summary>
        /// Attempts to call the 'SaveState' method
        /// on a controller to create a saved state bundle
        /// </summary>
        /// <param name="controller"></param>
        /// <returns>An IMvxBundle object that contains any saved state collected.</returns>
        public static IMvxBundle GetSavedState(this IMvxController controller)
        {
            var mvxBundle = new MvxBundle();
            var methods   =
                controller.GetType()
                .GetTypeInfo()
                .DeclaredMethods.Where(m => m.Name == "SaveState")
                .Where(m => m.ReturnType != typeof(void))
                .Where(m => !m.GetParameters().Any());

            foreach (MethodInfo methodBase in methods)
            {
                object toStore = methodBase.Invoke(controller, new object[0]);
                if (toStore != null)
                {
                    mvxBundle.Write(toStore);
                }
            }
            return(mvxBundle);
        }
 protected virtual void CallControllerInitMethods(IMvxController controller, IMvxBundle parameterValues)
 {
     controller.InvokeMethodsWithBundle("Init", parameterValues);
 }
 protected virtual void CallReloadStateMethods(IMvxController controller, IMvxBundle savedState)
 {
     controller.InvokeMethodsWithBundle("ReloadState", savedState);
 }
Esempio n. 8
0
 public void DetachController()
 {
     Controller = null;
 }
Esempio n. 9
0
 protected virtual void CallControllerInitMethods(IMvxController controller, IMvxBundle parameterValues)
 {
     controller.InvokeMethodsWithBundle("Init", parameterValues);
 }
Esempio n. 10
0
 protected virtual void CallReloadStateMethods(IMvxController controller, IMvxBundle savedState)
 {
     controller.InvokeMethodsWithBundle("ReloadState", savedState);
 }
 public void DetachController()
 {
     Controller = null;
 }