MvcHttpActionDescriptor.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Reflection;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Web.Http.Controllers;
  9. using System.Threading;
  10. namespace Swashbuckle.Extension.Mvc
  11. {
  12. /// <summary>
  13. /// Action Descriptor for MVC
  14. /// </summary>
  15. public class MvcHttpActionDescriptor: HttpActionDescriptor
  16. {
  17. private MethodInfo _methodInfo;
  18. public MvcHttpActionDescriptor(MethodInfo methodInfo)
  19. {
  20. _methodInfo = methodInfo;
  21. }
  22. /// <summary>
  23. /// ActionName
  24. /// </summary>
  25. public override string ActionName => _methodInfo.Name;
  26. /// <summary>
  27. /// ReturnType
  28. /// </summary>
  29. public override Type ReturnType => _methodInfo.ReturnType;
  30. /// <summary>
  31. /// Return Descriptors of Parameters
  32. /// </summary>
  33. /// <returns></returns>
  34. public override Collection<HttpParameterDescriptor> GetParameters()
  35. {
  36. var self = this;
  37. return new Collection<HttpParameterDescriptor>(
  38. _methodInfo.GetParameters().Select(p => new MvcHttpActionParameterDescriptor(p, self) as HttpParameterDescriptor).ToList()
  39. );
  40. }
  41. /// <summary>
  42. /// Execute Method via Invoke
  43. /// </summary>
  44. /// <param name="controllerContext"></param>
  45. /// <param name="arguments"></param>
  46. /// <param name="cancellationToken"></param>
  47. /// <returns></returns>
  48. public override Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments, CancellationToken cancellationToken)
  49. {
  50. var tsc = new TaskCompletionSource<object>();
  51. var result = _methodInfo.Invoke(controllerContext.Controller, arguments.Select(s => s.Value).ToArray());
  52. tsc.SetResult(result);
  53. return tsc.Task;
  54. }
  55. }
  56. }