1
+ //HintName: ValidatableInfoResolver.g.cs
2
+ #nullable enable annotations
3
+ //------------------------------------------------------------------------------
4
+ // <auto-generated>
5
+ // This code was generated by a tool.
6
+ //
7
+ // Changes to this file may cause incorrect behavior and will be lost if
8
+ // the code is regenerated.
9
+ // </auto-generated>
10
+ //------------------------------------------------------------------------------
11
+ #nullable enable
12
+ #pragma warning disable ASP0029
13
+
14
+ namespace System . Runtime . CompilerServices
15
+ {
16
+ [ global ::System . CodeDom . Compiler . GeneratedCodeAttribute ( "Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60" , "42.42.42.42" ) ]
17
+ [ AttributeUsage ( AttributeTargets . Method , AllowMultiple = true ) ]
18
+ file sealed class InterceptsLocationAttribute : System . Attribute
19
+ {
20
+ public InterceptsLocationAttribute ( int version , string data )
21
+ {
22
+ }
23
+ }
24
+ }
25
+
26
+ namespace Microsoft . Extensions . Validation . Generated
27
+ {
28
+ [ global ::System . CodeDom . Compiler . GeneratedCodeAttribute ( "Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60" , "42.42.42.42" ) ]
29
+ file sealed class GeneratedValidatablePropertyInfo : global ::Microsoft . Extensions . Validation . ValidatablePropertyInfo
30
+ {
31
+ public GeneratedValidatablePropertyInfo (
32
+ [ param: global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMembers ( global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicProperties | global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicConstructors ) ]
33
+ global ::System . Type containingType ,
34
+ global ::System . Type propertyType ,
35
+ string name ,
36
+ string displayName ) : base ( containingType , propertyType , name , displayName )
37
+ {
38
+ ContainingType = containingType ;
39
+ Name = name ;
40
+ }
41
+
42
+ [ global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMembers ( global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicProperties | global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicConstructors ) ]
43
+ internal global ::System . Type ContainingType { get ; }
44
+ internal string Name { get ; }
45
+
46
+ protected override global ::System . ComponentModel . DataAnnotations . ValidationAttribute [ ] GetValidationAttributes ( )
47
+ => ValidationAttributeCache . GetValidationAttributes ( ContainingType , Name ) ;
48
+ }
49
+
50
+ [ global ::System . CodeDom . Compiler . GeneratedCodeAttribute ( "Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60" , "42.42.42.42" ) ]
51
+ file sealed class GeneratedValidatableTypeInfo : global ::Microsoft . Extensions . Validation . ValidatableTypeInfo
52
+ {
53
+ public GeneratedValidatableTypeInfo (
54
+ [ param: global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMembers ( global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . Interfaces ) ]
55
+ global ::System . Type type ,
56
+ ValidatablePropertyInfo [ ] members ) : base ( type , members ) { }
57
+ }
58
+
59
+ [ global ::System . CodeDom . Compiler . GeneratedCodeAttribute ( "Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60" , "42.42.42.42" ) ]
60
+ file class GeneratedValidatableInfoResolver : global ::Microsoft . Extensions . Validation . IValidatableInfoResolver
61
+ {
62
+ public bool TryGetValidatableTypeInfo ( global ::System . Type type , [ global ::System . Diagnostics . CodeAnalysis . NotNullWhen ( true ) ] out global ::Microsoft . Extensions . Validation . IValidatableInfo ? validatableInfo )
63
+ {
64
+ validatableInfo = null ;
65
+ if ( type == typeof ( global ::ComplexTypeWithJsonIgnore ) )
66
+ {
67
+ validatableInfo = new GeneratedValidatableTypeInfo (
68
+ type : typeof ( global ::ComplexTypeWithJsonIgnore ) ,
69
+ members : [
70
+ new GeneratedValidatablePropertyInfo (
71
+ containingType : typeof ( global ::ComplexTypeWithJsonIgnore ) ,
72
+ propertyType : typeof ( int ) ,
73
+ name : "ValidatedProperty" ,
74
+ displayName : "ValidatedProperty"
75
+ ) ,
76
+ ]
77
+ ) ;
78
+ return true ;
79
+ }
80
+ if ( type == typeof ( global ::RecordTypeWithJsonIgnore ) )
81
+ {
82
+ validatableInfo = new GeneratedValidatableTypeInfo (
83
+ type : typeof ( global ::RecordTypeWithJsonIgnore ) ,
84
+ members : [
85
+ new GeneratedValidatablePropertyInfo (
86
+ containingType : typeof ( global ::RecordTypeWithJsonIgnore ) ,
87
+ propertyType : typeof ( int ) ,
88
+ name : "ValidatedProperty" ,
89
+ displayName : "ValidatedProperty"
90
+ ) ,
91
+ ]
92
+ ) ;
93
+ return true ;
94
+ }
95
+
96
+ return false ;
97
+ }
98
+
99
+ // No-ops, rely on runtime code for ParameterInfo-based resolution
100
+ public bool TryGetValidatableParameterInfo ( global ::System . Reflection . ParameterInfo parameterInfo , [ global ::System . Diagnostics . CodeAnalysis . NotNullWhen ( true ) ] out global ::Microsoft . Extensions . Validation . IValidatableInfo ? validatableInfo )
101
+ {
102
+ validatableInfo = null ;
103
+ return false ;
104
+ }
105
+ }
106
+
107
+ [ global ::System . CodeDom . Compiler . GeneratedCodeAttribute ( "Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60" , "42.42.42.42" ) ]
108
+ file static class GeneratedServiceCollectionExtensions
109
+ {
110
+ [ InterceptsLocation ]
111
+ public static global ::Microsoft . Extensions . DependencyInjection . IServiceCollection AddValidation ( this global ::Microsoft . Extensions . DependencyInjection . IServiceCollection services , global ::System . Action < global ::Microsoft . Extensions . Validation . ValidationOptions > ? configureOptions = null )
112
+ {
113
+ // Use non-extension method to avoid infinite recursion.
114
+ return global ::Microsoft . Extensions . DependencyInjection . ValidationServiceCollectionExtensions . AddValidation ( services , options =>
115
+ {
116
+ options . Resolvers . Insert ( 0 , new GeneratedValidatableInfoResolver ( ) ) ;
117
+ if ( configureOptions is not null )
118
+ {
119
+ configureOptions ( options ) ;
120
+ }
121
+ } ) ;
122
+ }
123
+ }
124
+
125
+ [ global ::System . CodeDom . Compiler . GeneratedCodeAttribute ( "Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60" , "42.42.42.42" ) ]
126
+ file static class ValidationAttributeCache
127
+ {
128
+ private sealed record CacheKey (
129
+ [ param: global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMembers ( global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicProperties | global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicConstructors ) ]
130
+ [ property: global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMembers ( global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicProperties | global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicConstructors ) ]
131
+ global ::System . Type ContainingType ,
132
+ string PropertyName ) ;
133
+ private static readonly global ::System . Collections . Concurrent . ConcurrentDictionary < CacheKey , global ::System . ComponentModel . DataAnnotations . ValidationAttribute [ ] > _cache = new ( ) ;
134
+
135
+ public static global ::System . ComponentModel . DataAnnotations . ValidationAttribute [ ] GetValidationAttributes (
136
+ [ global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMembers ( global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicProperties | global ::System . Diagnostics . CodeAnalysis . DynamicallyAccessedMemberTypes . PublicConstructors ) ]
137
+ global ::System . Type containingType ,
138
+ string propertyName )
139
+ {
140
+ var key = new CacheKey ( containingType , propertyName ) ;
141
+ return _cache . GetOrAdd ( key , static k =>
142
+ {
143
+ var results = new global ::System . Collections . Generic . List < global ::System . ComponentModel . DataAnnotations . ValidationAttribute > ( ) ;
144
+
145
+ // Get attributes from the property
146
+ var property = k . ContainingType . GetProperty ( k . PropertyName ) ;
147
+ if ( property != null )
148
+ {
149
+ var propertyAttributes = global ::System . Reflection . CustomAttributeExtensions
150
+ . GetCustomAttributes < global ::System . ComponentModel . DataAnnotations . ValidationAttribute > ( property , inherit : true ) ;
151
+
152
+ results . AddRange ( propertyAttributes ) ;
153
+ }
154
+
155
+ // Check constructors for parameters that match the property name
156
+ // to handle record scenarios
157
+ foreach ( var constructor in k . ContainingType . GetConstructors ( ) )
158
+ {
159
+ // Look for parameter with matching name (case insensitive)
160
+ var parameter = global ::System . Linq . Enumerable . FirstOrDefault (
161
+ constructor . GetParameters ( ) ,
162
+ p => string . Equals ( p . Name , k . PropertyName , global ::System . StringComparison . OrdinalIgnoreCase ) ) ;
163
+
164
+ if ( parameter != null )
165
+ {
166
+ var paramAttributes = global ::System . Reflection . CustomAttributeExtensions
167
+ . GetCustomAttributes < global ::System . ComponentModel . DataAnnotations . ValidationAttribute > ( parameter , inherit : true ) ;
168
+
169
+ results . AddRange ( paramAttributes ) ;
170
+
171
+ break ;
172
+ }
173
+ }
174
+
175
+ return results . ToArray ( ) ;
176
+ } ) ;
177
+ }
178
+ }
179
+ }
0 commit comments