diff --git a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs index 1002396a5..d6a57128e 100644 --- a/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs +++ b/src/NJsonSchema.Tests/Generation/EnumGenerationTests.cs @@ -231,5 +231,39 @@ public async Task When_enum_property_is_required_then_MinLength_is_not_set() Assert.True(schema.Properties["Bar"].OneOf.Count == 0); Assert.True(schema.Properties["Bar"].Reference != null); } + + public class ClassWithEnumDataTypeOnString + { + [EnumDataType(typeof(Bar))] + public string BarValue { get; set; } + } + + public class ClassWithEnumDataTypeOnInt + { + [EnumDataType(typeof(Bar))] + public int BarValue { get; set; } + } + + [Fact] + public async Task When_string_property_has_EnumDataType_annotation_then_schema_has_enum() + { + // Arrange & Act + var schema = NewtonsoftJsonSchemaGenerator.FromType(new NewtonsoftJsonSchemaGeneratorSettings()); + + // Assert + Assert.True(schema.Properties["BarValue"].ActualTypeSchema.IsEnumeration); + Assert.Equal(3, schema.Properties["BarValue"].ActualTypeSchema.Enumeration.Count); + } + + [Fact] + public async Task When_int_property_has_EnumDataType_annotation_then_schema_has_enum() + { + // Arrange & Act + var schema = NewtonsoftJsonSchemaGenerator.FromType(new NewtonsoftJsonSchemaGeneratorSettings()); + + // Assert + Assert.True(schema.Properties["BarValue"].ActualTypeSchema.IsEnumeration); + Assert.Equal(3, schema.Properties["BarValue"].ActualTypeSchema.Enumeration.Count); + } } } \ No newline at end of file diff --git a/src/NJsonSchema/Generation/ReflectionServiceBase.cs b/src/NJsonSchema/Generation/ReflectionServiceBase.cs index 0114b2ef0..4befbb225 100644 --- a/src/NJsonSchema/Generation/ReflectionServiceBase.cs +++ b/src/NJsonSchema/Generation/ReflectionServiceBase.cs @@ -51,6 +51,18 @@ public JsonTypeDescription GetDescription(ContextualType contextualType, Referen } } + dynamic? enumDataTypeAttribute = contextualType.GetContextAttributes(true) + .FirstAssignableToTypeNameOrDefault("System.ComponentModel.DataAnnotations.EnumDataTypeAttribute"); + if (enumDataTypeAttribute != null) + { + var enumType = (Type)enumDataTypeAttribute.EnumType; + if (enumType != null && enumType.IsEnum) + { + type = enumType; + contextualType = enumType.ToContextualType(); + } + } + var jsonSchemaAttribute = contextualType.GetContextOrTypeAttribute(true); ; if (jsonSchemaAttribute != null) {