public override void OnExit(MethodExecutionArgs args) { Type retType = ((MethodInfo)args.Method).ReturnType; if (MethodCallType == MauMethodCallType.ExecuteFromAngular || !MyAngularUi.IsConnected) { base.OnExit(args); return; } // Prepare Args List <object> argsToSend = args.Arguments.ToList(); for (int i = 0; i < argsToSend.Count; i++) { object param = argsToSend[i]; if (!param.GetType().IsEnum || !MauEnumMemberAttribute.HasAttribute((Enum)param)) { continue; } argsToSend[i] = MauEnumMemberAttribute.GetValue((Enum)param); } // Send var holder = (MauComponent)args.Instance; var data = new JObject { { "methodType", (int)MethodType }, { "methodName", MethodName }, { "methodArgs", JArray.FromObject(argsToSend) } }; MyAngularUi.RequestState request = MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.CallMethod, data).GetAwaiter().GetResult(); // Wait return // If its void function then just wait until execution finish if (retType == typeof(void)) { // Wait function holder.GetMethodRetValue(request.RequestId); return; } // Wait and set return value of function object ret = holder.GetMethodRetValue(request.RequestId); if (ret is not null) { args.ReturnValue = ret /*?? Activator.CreateInstance(retType)*/; } }
internal static void SendMauProp(MauComponent holder, string mauPropName) { MauPropertyHolder mauPropHolder = holder.GetMauPropHolder(mauPropName); Type propType = holder.HandledProps[mauPropName].Holder.PropertyType; object propValue = holder.HandledProps[mauPropName].Holder.GetValue(holder); // bypass is for props not yet changed from .Net side // so it's just to not override angular prop value bool bypass = false; if (!mauPropHolder.Touched) { bypass = true; } else if (mauPropHolder.PropAttr.PropStatus == MauPropertyStatus.ReadOnly) { bypass = true; } else if (propType.IsEnum) { if (!MauEnumMemberAttribute.HasNotSetValue(propValue.GetType())) { throw new Exception($"NotSet must to be in any MauProperty value is 'Enum', {propValue.GetType().FullName}"); } if (MauEnumMemberAttribute.HasAttribute((Enum)propValue)) { propValue = MauEnumMemberAttribute.GetValue((Enum)propValue); } // If it's NotSet just ignore so the angular value will be set, // Angular value will be in .Net side, so the value will be correct here. // E.g: Color prop if it's NotSet in .Net then use and don't change // Angular value. switch (propValue) { case int: case long and 0: case string propValStr when string.IsNullOrWhiteSpace(propValStr): bypass = true; break; } } else if (propValue == null && propType == typeof(string)) { // null not same as empty string bypass = true; } // Don't send .Net value and ask angular for it's value if (bypass) { holder.RequestPropValue(mauPropName); return; } var data = new JObject { { "propType", (int)mauPropHolder.PropAttr.PropType }, { "propStatus", (int)mauPropHolder.PropAttr.PropStatus }, { "propForce", mauPropHolder.PropAttr.ForceSet }, { "propName", mauPropName }, { "propVal", MyAngularUi.ParseMauDataToFrontEnd(propType, propValue) } }; MyAngularUi.SendRequestAsync(holder.MauId, MyAngularUi.RequestType.SetPropValue, data); }