Net Core: найти тип данных из метода действия контроллера - PullRequest
0 голосов
/ 25 сентября 2019

Как мне найти DataType T из метода действия контроллера?Например, ниже тип данных: GetBookResponse.

[HttpGet("[Action]/{id}")]
[ProducesResponseType(typeof(GetBookResponse), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(GetBookResponse), StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<GetBookResponse>> GetByBook(int id)
{
   var book = await bookservice.GetBookById(id);
   return Ok(book);
}

Я испробовал метод ниже, однако иногда он может давать ошибку.В поисках лучшего решения, возможно, с отражением.

Type returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0];

В коде: Net Core API: Создайте глобальный параметр ProducesResponseType или автоматизируйте

public class ProduceResponseTypeModelProvider : IApplicationModelProvider
{
    public int Order => 3;

    public void OnProvidersExecuted(ApplicationModelProviderContext context)
    {
    }

    public void OnProvidersExecuting(ApplicationModelProviderContext context)
    {
        foreach (ControllerModel controller in context.Result.Controllers)
        {
            foreach (ActionModel action in controller.Actions)
            {
                // I assume that all you actions type are Task<ActionResult<ReturnType>>

                Type returnType = action.ActionMethod.ReturnType.GenericTypeArguments[0].GetGenericArguments()[0];

                action.Filters.Add(new ProducesResponseTypeAttribute(StatusCodes.Status510NotExtended));
                action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status200OK));
                action.Filters.Add(new ProducesResponseTypeAttribute(returnType, StatusCodes.Status500InternalServerError));
            }
        }
    }
}

ВЗапуск:

public void ConfigureServices(IServiceCollection services)
{
    ...   
    services.TryAddEnumerable(ServiceDescriptor.Transient<IApplicationModelProvider, ProduceResponseTypeModelProvider>());
    ...
}

"System.IndexOutOfRangeException: 'Индекс находился за пределами массива.'"

Обновление: После рекомендации это не удалось в коде ниже.Контроллер не имеет возвращаемого типа и, следовательно, может не требовать типа ответа.Я буду работать над разрешением кода для этого с нулевым решением, для кода в верхней части вопроса.Любой может свободно переписать на месте в ответ, спасибо

Net Core API: сделать ProducesResponseType глобальным параметром или автоматизировать

[HttpGet("{id}/Attachment")]
public async Task<IActionResult> DownloadDocumentAttachment(int id)
{
    var attachment = await noteDocumentService.GetDocumentAttachment(id);

    if(attachment == null)
    {
        return NotFound();
    }
    return File(attachment.FileStream, attachment.FileContentType, attachment.FileName);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...