|
|
@@ -0,0 +1,210 @@
|
|
|
+//HintName: ValidatableInfoResolver.g.cs
|
|
|
+#nullable enable annotations
|
|
|
+//------------------------------------------------------------------------------
|
|
|
+// <auto-generated>
|
|
|
+// This code was generated by a tool.
|
|
|
+//
|
|
|
+// Changes to this file may cause incorrect behavior and will be lost if
|
|
|
+// the code is regenerated.
|
|
|
+// </auto-generated>
|
|
|
+//------------------------------------------------------------------------------
|
|
|
+#nullable enable
|
|
|
+#pragma warning disable ASP0029
|
|
|
+
|
|
|
+namespace System.Runtime.CompilerServices
|
|
|
+{
|
|
|
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")]
|
|
|
+ [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
|
|
|
+ file sealed class InterceptsLocationAttribute : System.Attribute
|
|
|
+ {
|
|
|
+ public InterceptsLocationAttribute(int version, string data)
|
|
|
+ {
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+namespace Microsoft.Extensions.Validation.Generated
|
|
|
+{
|
|
|
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")]
|
|
|
+ file sealed class GeneratedValidatablePropertyInfo : global::Microsoft.Extensions.Validation.ValidatablePropertyInfo
|
|
|
+ {
|
|
|
+ public GeneratedValidatablePropertyInfo(
|
|
|
+ [param: global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties | global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
|
|
|
+ global::System.Type containingType,
|
|
|
+ global::System.Type propertyType,
|
|
|
+ string name,
|
|
|
+ string displayName) : base(containingType, propertyType, name, displayName)
|
|
|
+ {
|
|
|
+ ContainingType = containingType;
|
|
|
+ Name = name;
|
|
|
+ }
|
|
|
+
|
|
|
+ [global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties | global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
|
|
|
+ internal global::System.Type ContainingType { get; }
|
|
|
+ internal string Name { get; }
|
|
|
+
|
|
|
+ protected override global::System.ComponentModel.DataAnnotations.ValidationAttribute[] GetValidationAttributes()
|
|
|
+ => ValidationAttributeCache.GetPropertyValidationAttributes(ContainingType, Name);
|
|
|
+ }
|
|
|
+
|
|
|
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")]
|
|
|
+ file sealed class GeneratedValidatableTypeInfo : global::Microsoft.Extensions.Validation.ValidatableTypeInfo
|
|
|
+ {
|
|
|
+ public GeneratedValidatableTypeInfo(
|
|
|
+ [param: global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)]
|
|
|
+ global::System.Type type,
|
|
|
+ ValidatablePropertyInfo[] members) : base(type, members)
|
|
|
+ {
|
|
|
+ Type = type;
|
|
|
+ }
|
|
|
+
|
|
|
+ [global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)]
|
|
|
+ internal global::System.Type Type { get; }
|
|
|
+
|
|
|
+ protected override global::System.ComponentModel.DataAnnotations.ValidationAttribute[] GetValidationAttributes()
|
|
|
+ => ValidationAttributeCache.GetTypeValidationAttributes(Type);
|
|
|
+ }
|
|
|
+
|
|
|
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")]
|
|
|
+ file class GeneratedValidatableInfoResolver : global::Microsoft.Extensions.Validation.IValidatableInfoResolver
|
|
|
+ {
|
|
|
+ public bool TryGetValidatableTypeInfo(global::System.Type type, [global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out global::Microsoft.Extensions.Validation.IValidatableInfo? validatableInfo)
|
|
|
+ {
|
|
|
+ validatableInfo = null;
|
|
|
+ if (type == typeof(global::Address))
|
|
|
+ {
|
|
|
+ validatableInfo = new GeneratedValidatableTypeInfo(
|
|
|
+ type: typeof(global::Address),
|
|
|
+ members: [
|
|
|
+ new GeneratedValidatablePropertyInfo(
|
|
|
+ containingType: typeof(global::Address),
|
|
|
+ propertyType: typeof(string),
|
|
|
+ name: "Street",
|
|
|
+ displayName: "Street"
|
|
|
+ ),
|
|
|
+ ]
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (type == typeof(global::Order))
|
|
|
+ {
|
|
|
+ validatableInfo = new GeneratedValidatableTypeInfo(
|
|
|
+ type: typeof(global::Order),
|
|
|
+ members: [
|
|
|
+ new GeneratedValidatablePropertyInfo(
|
|
|
+ containingType: typeof(global::Order),
|
|
|
+ propertyType: typeof(string),
|
|
|
+ name: "CustomerName",
|
|
|
+ displayName: "CustomerName"
|
|
|
+ ),
|
|
|
+ new GeneratedValidatablePropertyInfo(
|
|
|
+ containingType: typeof(global::Order),
|
|
|
+ propertyType: typeof(global::Address),
|
|
|
+ name: "ShippingAddress",
|
|
|
+ displayName: "ShippingAddress"
|
|
|
+ ),
|
|
|
+ ]
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // No-ops, rely on runtime code for ParameterInfo-based resolution
|
|
|
+ public bool TryGetValidatableParameterInfo(global::System.Reflection.ParameterInfo parameterInfo, [global::System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out global::Microsoft.Extensions.Validation.IValidatableInfo? validatableInfo)
|
|
|
+ {
|
|
|
+ validatableInfo = null;
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")]
|
|
|
+ file static class GeneratedServiceCollectionExtensions
|
|
|
+ {
|
|
|
+ [InterceptsLocation]
|
|
|
+ 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)
|
|
|
+ {
|
|
|
+ // Use non-extension method to avoid infinite recursion.
|
|
|
+ return global::Microsoft.Extensions.DependencyInjection.ValidationServiceCollectionExtensions.AddValidation(services, options =>
|
|
|
+ {
|
|
|
+ options.Resolvers.Insert(0, new GeneratedValidatableInfoResolver());
|
|
|
+ if (configureOptions is not null)
|
|
|
+ {
|
|
|
+ configureOptions(options);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Extensions.Validation.ValidationsGenerator, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60", "42.42.42.42")]
|
|
|
+ file static class ValidationAttributeCache
|
|
|
+ {
|
|
|
+ private sealed record CacheKey(
|
|
|
+ [param: global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties | global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
|
|
|
+ [property: global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties | global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
|
|
|
+ global::System.Type ContainingType,
|
|
|
+ string PropertyName);
|
|
|
+ private static readonly global::System.Collections.Concurrent.ConcurrentDictionary<CacheKey, global::System.ComponentModel.DataAnnotations.ValidationAttribute[]> _propertyCache = new();
|
|
|
+ private static readonly global::System.Lazy<global::System.Collections.Concurrent.ConcurrentDictionary<global::System.Type, global::System.ComponentModel.DataAnnotations.ValidationAttribute[]>> _lazyTypeCache = new (() => new ());
|
|
|
+ private static global::System.Collections.Concurrent.ConcurrentDictionary<global::System.Type, global::System.ComponentModel.DataAnnotations.ValidationAttribute[]> TypeCache => _lazyTypeCache.Value;
|
|
|
+
|
|
|
+ public static global::System.ComponentModel.DataAnnotations.ValidationAttribute[] GetPropertyValidationAttributes(
|
|
|
+ [global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties | global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)]
|
|
|
+ global::System.Type containingType,
|
|
|
+ string propertyName)
|
|
|
+ {
|
|
|
+ var key = new CacheKey(containingType, propertyName);
|
|
|
+ return _propertyCache.GetOrAdd(key, static k =>
|
|
|
+ {
|
|
|
+ var results = new global::System.Collections.Generic.List<global::System.ComponentModel.DataAnnotations.ValidationAttribute>();
|
|
|
+
|
|
|
+ // Get attributes from the property
|
|
|
+ var property = k.ContainingType.GetProperty(k.PropertyName);
|
|
|
+ if (property != null)
|
|
|
+ {
|
|
|
+ var propertyAttributes = global::System.Reflection.CustomAttributeExtensions
|
|
|
+ .GetCustomAttributes<global::System.ComponentModel.DataAnnotations.ValidationAttribute>(property, inherit: true);
|
|
|
+
|
|
|
+ results.AddRange(propertyAttributes);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check constructors for parameters that match the property name
|
|
|
+ // to handle record scenarios
|
|
|
+ foreach (var constructor in k.ContainingType.GetConstructors())
|
|
|
+ {
|
|
|
+ // Look for parameter with matching name (case insensitive)
|
|
|
+ var parameter = global::System.Linq.Enumerable.FirstOrDefault(
|
|
|
+ constructor.GetParameters(),
|
|
|
+ p => string.Equals(p.Name, k.PropertyName, global::System.StringComparison.OrdinalIgnoreCase));
|
|
|
+
|
|
|
+ if (parameter != null)
|
|
|
+ {
|
|
|
+ var paramAttributes = global::System.Reflection.CustomAttributeExtensions
|
|
|
+ .GetCustomAttributes<global::System.ComponentModel.DataAnnotations.ValidationAttribute>(parameter, inherit: true);
|
|
|
+
|
|
|
+ results.AddRange(paramAttributes);
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return results.ToArray();
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static global::System.ComponentModel.DataAnnotations.ValidationAttribute[] GetTypeValidationAttributes(
|
|
|
+ [global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(global::System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces)]
|
|
|
+ global::System.Type type
|
|
|
+ )
|
|
|
+ {
|
|
|
+ return TypeCache.GetOrAdd(type, static t =>
|
|
|
+ {
|
|
|
+ var typeAttributes = global::System.Reflection.CustomAttributeExtensions
|
|
|
+ .GetCustomAttributes<global::System.ComponentModel.DataAnnotations.ValidationAttribute>(t, inherit: true);
|
|
|
+ return global::System.Linq.Enumerable.ToArray(typeAttributes);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|