コード例 #1
0
ファイル: MauEnumMember.cs プロジェクト: zanzo420/MyAngularUi
        public static bool GetValidEnumValue(Type valueType, ref object originalValue)
        {
            if (!valueType.IsEnum)
            {
                return(false);
            }

            if (!MauEnumMemberAttribute.HasNotSetValue(valueType))
            {
                throw new Exception($"'MauEnumMember.NotSet' must to be in any 'Enum' used as 'MauProperty' type or return of 'MauMethod'. {valueType.FullName}");
            }

            object o           = originalValue;
            string enumValName = valueType.GetFields()
                                 .Where(MauEnumMemberAttribute.HasAttribute)
                                 .FirstOrDefault(f =>
            {
                var f1 = f.GetCustomAttributes <MauEnumMemberAttribute>(false)
                         .FirstOrDefault(memEnum => memEnum.IsEqual(o));

                return(f1?.IsEqual(o) == true);
            })?.Name;

            originalValue = Enum.Parse(valueType, string.IsNullOrEmpty(enumValName) ? "NotSet" : enumValName);
            return(true);
        }
コード例 #2
0
ファイル: MauMethod.cs プロジェクト: zanzo420/MyAngularUi
        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)*/;
            }
        }
コード例 #3
0
        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);
        }