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); }
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); }