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