Skip to content

Commit 31ad99f

Browse files
authored
Use NullabilityInfoContext to determine dictionary nullability (#3041)
Use `NullabilityInfoContext` to determine dictionary type nullability correctly.
1 parent 7a7230d commit 31ad99f

File tree

3 files changed

+257
-44
lines changed

3 files changed

+257
-44
lines changed

src/Swashbuckle.AspNetCore.SwaggerGen/SchemaGenerator/MemberInfoExtensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,23 @@ public static bool IsNonNullableReferenceType(this MemberInfo memberInfo)
6161

6262
public static bool IsDictionaryValueNonNullable(this MemberInfo memberInfo)
6363
{
64+
#if NET6_0_OR_GREATER
65+
var context = new NullabilityInfoContext();
66+
var nullableInfo = memberInfo.MemberType == MemberTypes.Field
67+
? context.Create((FieldInfo)memberInfo)
68+
: context.Create((PropertyInfo)memberInfo);
69+
70+
if (nullableInfo.GenericTypeArguments.Length != 2)
71+
{
72+
var length = nullableInfo.GenericTypeArguments.Length;
73+
var type = nullableInfo.Type.FullName;
74+
var container = memberInfo.DeclaringType.FullName;
75+
var member = memberInfo.Name;
76+
throw new InvalidOperationException($"Expected Dictionary to have two generic type arguments but it had {length}. Member: {container}.{member} Type: {type}.");
77+
}
78+
79+
return nullableInfo.GenericTypeArguments[1].ReadState == NullabilityState.NotNull;
80+
#else
6481
var memberType = memberInfo.MemberType == MemberTypes.Field
6582
? ((FieldInfo)memberInfo).FieldType
6683
: ((PropertyInfo)memberInfo).PropertyType;
@@ -104,6 +121,7 @@ public static bool IsDictionaryValueNonNullable(this MemberInfo memberInfo)
104121
}
105122

106123
return false;
124+
#endif
107125
}
108126

109127
private static object GetNullableAttribute(this MemberInfo memberInfo)

0 commit comments

Comments
 (0)