public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var jToken = JToken.Load(reader);

            if (jToken.Type == JTokenType.Null)
            {
                return(null);
            }

            int[] values   = ((JArray)jToken).Values <int>().ToArray();
            var   pureType = NullableUtils.GetUnderlyingTypeIfNullable(objectType);

            FieldInfo[] enumFields = pureType.GetFields(BindingFlags.Public | BindingFlags.Static);
            int         setFlags   = 0;

            foreach (FieldInfo enumField in enumFields)
            {
                int enumValue = (int)enumField.GetValue(null);

                // If there is a serialize value set for the enum value, look for that instead of the int value
                SerializeValueAttribute serializeValue = enumField.GetCustomAttribute <SerializeValueAttribute>();
                int searchValue = serializeValue?.Value ?? enumValue;
                if (Array.IndexOf(values, searchValue) >= 0)
                {
                    setFlags |= enumValue;
                }
            }

            return(Enum.ToObject(pureType, setFlags));
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            FieldInfo[]   enumFields = value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static);
            List <string> setFlags   = new List <string>();

            foreach (FieldInfo enumField in enumFields)
            {
                // Make sure the flag is set before doing any other work
                int enumValue = (int)enumField.GetValue(null);
                if (((int)value & enumValue) == 0)
                {
                    continue;
                }

                // If there is a serialize value set for the member, use that instead of the int value
                SerializeValueAttribute serializeValue = enumField.GetCustomAttribute <SerializeValueAttribute>();
                string flagValue = serializeValue?.Value ?? enumField.Name;
                if (serializer.ContractResolver is CamelCasePropertyNamesContractResolver)
                {
                    flagValue = char.ToLowerInvariant(flagValue[0]) + flagValue.Substring(1);
                }
                setFlags.Add($"\"{flagValue}\"");
            }

            string joinedFlags = string.Join(", ", setFlags);

            writer.WriteRawValue($"[{joinedFlags}]");
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            JToken jToken = JToken.Load(reader);

            if (jToken.Type == JTokenType.Null)
            {
                return(null);
            }

            string[] values   = ((JArray)jToken).Values <string>().ToArray();
            var      pureType = NullableUtils.GetUnderlyingTypeIfNullable(objectType);

            FieldInfo[] enumFields = pureType.GetFields(BindingFlags.Public | BindingFlags.Static);
            int         setFlags   = 0;

            foreach (FieldInfo enumField in enumFields)
            {
                // If there is a serialize value set for the enum value, look for the instead of the int value
                SerializeValueAttribute serializeValue = enumField.GetCustomAttribute <SerializeValueAttribute>();
                string searchValue = serializeValue?.Value ?? enumField.Name;
                if (serializer.ContractResolver is CamelCasePropertyNamesContractResolver)
                {
                    searchValue = char.ToLowerInvariant(searchValue[0]) + searchValue.Substring(1);
                }

                // If the value is in the json array, or the int value into the flags
                if (Array.IndexOf(values, searchValue) >= 0)
                {
                    setFlags |= (int)enumField.GetValue(null);
                }
            }

            return(Enum.ToObject(pureType, setFlags));
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            FieldInfo[] enumFields = value.GetType().GetFields(BindingFlags.Public | BindingFlags.Static);
            List <int>  setFlags   = new List <int>();

            foreach (FieldInfo enumField in enumFields)
            {
                // Make sure the flag is set before doing expensive reflection
                int enumValue = (int)enumField.GetValue(null);
                if (((int)value & enumValue) == 0)
                {
                    continue;
                }

                // If there is a serialize value set for the member, use that instead of the int value
                SerializeValueAttribute serializeValue = enumField.GetCustomAttribute <SerializeValueAttribute>();
                int flagValue = serializeValue?.Value ?? enumValue;
                setFlags.Add(flagValue);
            }

            string joinedFlags = string.Join(", ", setFlags);

            writer.WriteRawValue($"[{joinedFlags}]");
        }
Ejemplo n.º 5
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // TODO: Fix to handle nullables properly

            int[] values = JArray.Load(reader).Values <int>().ToArray();

            FieldInfo[] enumFields = objectType.GetFields(BindingFlags.Public | BindingFlags.Static);
            int         setFlags   = 0;

            foreach (FieldInfo enumField in enumFields)
            {
                int enumValue = (int)enumField.GetValue(null);

                // If there is a serialize value set for the enum value, look for that instead of the int value
                SerializeValueAttribute serializeValue = enumField.GetCustomAttribute <SerializeValueAttribute>();
                int searchValue = serializeValue?.Value ?? enumValue;
                if (Array.IndexOf(values, searchValue) >= 0)
                {
                    setFlags |= enumValue;
                }
            }

            return(Enum.ToObject(objectType, setFlags));
        }