SharpHurt

reflection

May 16th, 2023
845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.23 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Reflection;
  4.  
  5. namespace Documentation
  6. {
  7.     public class Specifier<T> : ISpecifier
  8.     {
  9.         private readonly Type objectType = typeof(T);
  10.        
  11.         public string GetApiDescription()
  12.         {
  13.             return GetAttribute<ApiDescriptionAttribute>(objectType)?.Description;
  14.         }
  15.  
  16.         public string[] GetApiMethodNames()
  17.         {
  18.             return objectType.GetMethods()
  19.                 .Where(m => m.GetCustomAttributes<ApiMethodAttribute>().Any())
  20.                 .Select(m => m.Name)
  21.                 .ToArray();
  22.         }
  23.  
  24.         public string GetApiMethodDescription(string methodName)
  25.         {
  26.             var methodInfo = GetMethod(methodName);
  27.             return methodInfo is null ? null : GetAttribute<ApiDescriptionAttribute>(methodInfo)?.Description;
  28.         }
  29.  
  30.         public string[] GetApiMethodParamNames(string methodName)
  31.         {
  32.             var methodInfo = GetMethod(methodName);
  33.             return methodInfo is null
  34.                 ? Array.Empty<string>()
  35.                 : methodInfo.GetParameters().Select(p => p.Name).ToArray();
  36.         }
  37.  
  38.         public string GetApiMethodParamDescription(string methodName, string paramName)
  39.         {
  40.             var methodInfo = GetMethod(methodName);
  41.             return methodInfo is null
  42.                 ? null
  43.                 : GetAttribute<ApiDescriptionAttribute>(GetParameter(methodInfo, paramName))?.Description;
  44.         }
  45.  
  46.         public ApiParamDescription GetApiMethodParamFullDescription(string methodName, string paramName)
  47.         {
  48.             var methodInfo = GetMethod(methodName);
  49.             if (methodInfo is null)
  50.                 return new ApiParamDescription { ParamDescription = new CommonDescription(paramName) };
  51.  
  52.             var parameterInfo = GetParameter(methodInfo, paramName);
  53.             return new ApiParamDescription
  54.             {
  55.                 ParamDescription = new CommonDescription
  56.                 {
  57.                     Name = paramName,
  58.                     Description = GetApiMethodParamDescription(methodName, paramName)
  59.                 },
  60.                 Required = GetAttribute<ApiRequiredAttribute>(parameterInfo)?.Required ?? false,
  61.                 MinValue = GetAttribute<ApiIntValidationAttribute>(parameterInfo)?.MinValue,
  62.                 MaxValue = GetAttribute<ApiIntValidationAttribute>(parameterInfo)?.MaxValue
  63.             };
  64.         }
  65.  
  66.         public ApiMethodDescription GetApiMethodFullDescription(string methodName)
  67.         {
  68.             var methodInfo = GetMethod(methodName);
  69.             if (methodInfo is null)
  70.                 return null;
  71.  
  72.             return new ApiMethodDescription
  73.             {
  74.                 ParamDescriptions = GetParamsDescription(methodInfo),
  75.                 MethodDescription = GetMethodDescription(methodInfo),
  76.                 ReturnDescription = GetDescription(methodInfo)
  77.             };
  78.         }
  79.  
  80.         private ParameterInfo GetParameter(MethodInfo methodInfo, string parameterName)
  81.         {
  82.             return methodInfo.GetParameters().FirstOrDefault(p => p.Name == parameterName);
  83.         }
  84.  
  85.         private TAttribute GetAttribute<TAttribute>(ParameterInfo parameterInfo) where TAttribute : Attribute
  86.         {
  87.             return parameterInfo?.GetCustomAttribute<TAttribute>();
  88.         }
  89.  
  90.         private TAttribute GetAttribute<TAttribute>(MethodInfo methodInfo) where TAttribute : Attribute
  91.         {
  92.             return methodInfo?.GetCustomAttribute<TAttribute>();
  93.         }
  94.  
  95.         private TAttribute GetAttribute<TAttribute>(Type type) where TAttribute : Attribute
  96.         {
  97.             return type?.GetCustomAttribute<TAttribute>();
  98.         }
  99.  
  100.         private MethodInfo GetMethod(string methodName)
  101.         {
  102.             var method = objectType.GetMethod(methodName);
  103.             return GetAttribute<ApiMethodAttribute>(method) is null ? null : method;
  104.         }
  105.  
  106.         private ApiParamDescription[] GetParamsDescription(MethodInfo method)
  107.         {
  108.             return method.GetParameters().Select(p => GetApiMethodParamFullDescription(method.Name, p.Name)).ToArray();
  109.         }
  110.  
  111.         private ApiParamDescription GetDescription(MethodInfo method)
  112.         {
  113.             var returnTypeCustomAttributes = method.ReturnTypeCustomAttributes.GetCustomAttributes(true);
  114.  
  115.             if (!returnTypeCustomAttributes.Any())
  116.                 return null;
  117.  
  118.             var apiRequiredAttribute = returnTypeCustomAttributes.OfType<ApiRequiredAttribute>().FirstOrDefault();
  119.             var apiIntValidationAttribute = returnTypeCustomAttributes.OfType<ApiIntValidationAttribute>().FirstOrDefault();
  120.  
  121.             return new ApiParamDescription
  122.             {
  123.                 Required = apiRequiredAttribute?.Required ?? false,
  124.                 MinValue = apiIntValidationAttribute?.MinValue,
  125.                 MaxValue = apiIntValidationAttribute?.MaxValue
  126.             };
  127.         }
  128.  
  129.         private CommonDescription GetMethodDescription(MethodInfo method)
  130.         {
  131.             return new CommonDescription
  132.             {
  133.                 Name = method.Name,
  134.                 Description = method.GetCustomAttribute<ApiDescriptionAttribute>()?.Description
  135.             };
  136.         }
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment