コード例 #1
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;
                }
            }
        }
コード例 #2
0
        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       = Enum.GetName(type, value);
                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 (int i = 0; i < names.Count; i++)
            {
                nameValueMapping.Add(JsonWriter.GetEncodedPropertyNameWithoutQuotation(names[i]), (T)values[i]);
                valueNameMapping[(T)values[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;
                }
            }
        }