You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.3 KiB

11 months ago
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4. using System.Text;
  5. namespace Apewer.Web
  6. {
  7. /// <summary>API 行为的参数。</summary>
  8. public sealed class ApiParameter : IToJson
  9. {
  10. ParameterInfo _parameter = null;
  11. bool _body = false;
  12. bool _query = false;
  13. /// <summary></summary>
  14. public ParameterInfo ParameterInfo { get => _parameter; }
  15. /// <summary></summary>
  16. public string Name { get => _parameter.Name; }
  17. /// <summary></summary>
  18. public Type Type { get => _parameter.ParameterType; }
  19. /// <summary></summary>
  20. public bool FromBody { get => _body; }
  21. /// <summary></summary>
  22. public bool FromQuery { get => _query; }
  23. /// <summary></summary>
  24. public override string ToString() => _parameter.Name;
  25. /// <summary></summary>
  26. public Json ToJson()
  27. {
  28. var format = ApiActionJsonFormat.Default ?? new ApiActionJsonFormat();
  29. var withReflection = format.WithReflection;
  30. return ToJson(withReflection);
  31. }
  32. /// <summary></summary>
  33. public Json ToJson(bool withReflection)
  34. {
  35. var json = Json.NewObject();
  36. json.SetProperty("name", _parameter.Name);
  37. if (withReflection)
  38. {
  39. json.SetProperty("type", _parameter.ParameterType.Name);
  40. }
  41. if (_body) json.SetProperty("fromBody", _body);
  42. if (_query) json.SetProperty("fromQuery", _query);
  43. return json;
  44. }
  45. /// <summary></summary>
  46. /// <exception cref="ArgumentNullException" />
  47. ApiParameter(ParameterInfo parameterInfo)
  48. {
  49. _parameter = parameterInfo ?? throw new ArgumentNullException(nameof(parameterInfo));
  50. _query = RuntimeUtility.Contains<FromQueryAttribute>(parameterInfo);
  51. _body = RuntimeUtility.Contains<FromBodyAttribute>(parameterInfo);
  52. }
  53. /// <summary></summary>
  54. public static ApiParameter Parse(ParameterInfo parameter)
  55. {
  56. if (parameter == null) return null;
  57. if (parameter.IsOut) return null;
  58. if (parameter.IsRetval) return null;
  59. return new ApiParameter(parameter);
  60. }
  61. }
  62. }