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