/// <summary> /// Initializes a new <see cref="StringEnumConverter{TEnum}"/> /// </summary> /// <param name="underlyingType">The underlying <see cref="Enum"/>'s type</param> /// <param name="jsonSerializerOptions">The current <see cref="Json.JsonSerializerOptions"/></param> public StringEnumConverter(Type underlyingType, JsonSerializerOptions jsonSerializerOptions) { this.UnderlyingType = underlyingType; this.JsonSerializerOptions = jsonSerializerOptions; Array values = this.UnderlyingType.GetEnumValues(); string[] names = this.UnderlyingType.GetEnumNames(); this.TypeCode = Type.GetTypeCode(this.UnderlyingType); this.IsFlags = this.UnderlyingType.IsDefined(typeof(FlagsAttribute), true); this.ValueMappings = new Dictionary <ulong, EnumFieldMetadata>(); this.NameMappings = new Dictionary <string, EnumFieldMetadata>(); for (int index = 0; index < values.Length; index++) { Enum value = (Enum)values.GetValue(index); ulong rawValue = this.GetRawValue(value); string name = names[index]; FieldInfo field = this.UnderlyingType.GetField(name, BindingFlags.Default | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); EnumMemberAttribute enumMemberAttribute = field.GetCustomAttribute <EnumMemberAttribute>(true); string transformedName = enumMemberAttribute?.Value ?? this.JsonSerializerOptions?.PropertyNamingPolicy.ConvertName(name) ?? name; EnumFieldMetadata fieldMetadata = new EnumFieldMetadata(name, transformedName, value, rawValue); if (!this.ValueMappings.ContainsKey(rawValue)) { this.ValueMappings.Add(rawValue, fieldMetadata); } this.NameMappings.Add(transformedName, fieldMetadata); } }
public FieldNodeViewModel(EnumFieldMetadata metadata) { Name = $"{metadata.Name} Value: {metadata.Value}"; Kind = TypeKind.EnumField; }