public EnumFormatter(bool serializeByName, bool serializePropertyByName) { this.serializeByName = serializeByName; this.serializePropertyByName = serializePropertyByName; this.serializeByUnderlyingValue = defaultSerializeByUnderlyingValue; this.deserializeByUnderlyingValue = defaultDeserializeByUnderlyingValue; }
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; }
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; }