/// <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); } }
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); }
public void DetachController() { Controller = null; }