Пример #1
0
 public EnumFormatter(bool serializeByName, bool serializePropertyByName)
 {
     this.serializeByName              = serializeByName;
     this.serializePropertyByName      = serializePropertyByName;
     this.serializeByUnderlyingValue   = defaultSerializeByUnderlyingValue;
     this.deserializeByUnderlyingValue = defaultDeserializeByUnderlyingValue;
 }
Пример #2
0
        static EnumFormatter()
        {
            var names  = Enum.GetNames(typeof(T));
            var values = Enum.GetValues(typeof(T));

            nameValueMapping = new ByteArrayStringHashTable <T>(names.Length);
            valueNameMapping = new Dictionary <T, string>(names.Length);

            for (int i = 0; i < names.Length; i++)
            {
                nameValueMapping.Add(JsonWriter.GetEncodedPropertyNameWithoutQuotation(names[i]), (T)values.GetValue(i));
                valueNameMapping[(T)values.GetValue(i)] = names[i];
            }

            // boxed... or generate...
            {
                bool isBoxed;
                var  serialize = EnumFormatterHelper.GetSerializeDelegate(typeof(T), out isBoxed);
                if (isBoxed)
                {
                    var boxSerialize = (JsonSerializeAction <object>)serialize;
                    defaultSerializeByUnderlyingValue = (ref JsonWriter writer, T value, IJsonFormatterResolver _) => boxSerialize.Invoke(ref writer, (object)value, _);
                }
                else
                {
                    defaultSerializeByUnderlyingValue = (JsonSerializeAction <T>)serialize;
                }
            }

            {
                bool isBoxed;
                var  deserialize = EnumFormatterHelper.GetDeserializeDelegate(typeof(T), out isBoxed);
                if (isBoxed)
                {
                    var boxDeserialize = (JsonDeserializeFunc <object>)deserialize;
                    defaultDeserializeByUnderlyingValue = (ref JsonReader reader, IJsonFormatterResolver _) => (T)boxDeserialize.Invoke(ref reader, _);
                }
                else
                {
                    defaultDeserializeByUnderlyingValue = (JsonDeserializeFunc <T>)deserialize;
                }
            }
        }
        static EnumFormatter()
        {
            var names  = new List <string>();
            var values = new List <object>();

            var type = typeof(T);

            foreach (var item in type.GetFields().Where(fi => fi.FieldType == type))
            {
                var value      = item.GetValue(null);
                var name       = item.Name;
                var dataMember = item.GetCustomAttributes(typeof(DataMemberAttribute), true)
                                 .OfType <DataMemberAttribute>()
                                 .FirstOrDefault();
                var enumMember = item.GetCustomAttributes(typeof(EnumMemberAttribute), true)
                                 .OfType <EnumMemberAttribute>()
                                 .FirstOrDefault();

                values.Add(value);
                names.Add(
                    (enumMember != null && enumMember.Value != null) ? enumMember.Value
                                        : (dataMember != null && dataMember.Name != null) ? dataMember.Name
                                        : name);
            }

            NameValueMapping = new ByteArrayStringHashTable <T>(names.Count);
            ValueNameMapping = new Dictionary <T, string>(names.Count);

            for (var i = 0; i < names.Count; i++)
            {
                NameValueMapping.Add(JsonWriter.GetEncodedPropertyNameWithoutQuotation(names[i]), (T)values[i]);
                ValueNameMapping[(T)values[i]] = names[i];
            }

            // boxed... or generate...
            {
                var serialize = EnumFormatterHelper.GetSerializeDelegate(typeof(T), out var isBoxed);
                if (isBoxed)
                {
                    var boxSerialize = (JsonSerializeAction <object>)serialize;
                    DefaultSerializeByUnderlyingValue = (ref JsonWriter writer, T value, IJsonFormatterResolver _) =>
                                                        boxSerialize.Invoke(ref writer, value, _);
                }
                else
                {
                    DefaultSerializeByUnderlyingValue = (JsonSerializeAction <T>)serialize;
                }
            }

            {
                var deserialize = EnumFormatterHelper.GetDeserializeDelegate(typeof(T), out var isBoxed);
                if (isBoxed)
                {
                    var boxDeserialize = (JsonDeserializeFunc <object>)deserialize;
                    DefaultDeserializeByUnderlyingValue =
                        (ref JsonReader reader, IJsonFormatterResolver _) => (T)boxDeserialize.Invoke(ref reader, _);
                }
                else
                {
                    DefaultDeserializeByUnderlyingValue = (JsonDeserializeFunc <T>)deserialize;
                }
            }
        }
 /// <summary>
 /// If can not use dynamic code-generation environment and want to avoid boxing, you can set func manually.
 /// </summary>
 public EnumFormatter(JsonSerializeAction <T> valueSerializeAction, JsonDeserializeFunc <T> valueDeserializeAction)
 {
     _serializeByName              = false;
     _serializeByUnderlyingValue   = valueSerializeAction;
     _deserializeByUnderlyingValue = valueDeserializeAction;
 }
 public EnumFormatter(bool serializeByName)
 {
     _serializeByName              = serializeByName;
     _serializeByUnderlyingValue   = DefaultSerializeByUnderlyingValue;
     _deserializeByUnderlyingValue = DefaultDeserializeByUnderlyingValue;
 }
Пример #6
0
 public AnonymousFormatter(JsonSerializeAction <T>?serialize, JsonDeserializeFunc <T>?deserialize)
 {
     this.serialize   = serialize;
     this.deserialize = deserialize;
 }
 public AnonymousFormatter(JsonSerializeAction <T> serialize, JsonDeserializeFunc <T> deserialize)
 {
     _serialize   = serialize;
     _deserialize = deserialize;
 }