Я не могу использовать свойства System. Net .Http.HttpMethod в качестве параметров выражения переключения в C# - PullRequest
1 голос
/ 16 января 2020

Я столкнулся с этой проблемой, из-за которой по какой-то причине я не могу использовать свойства System.Net.Http.HttpMethod в операторе switch. Забавно, но я могу использовать его в том же методе, вне выражения switch. Посмотрите на мой метод:

private ObjectResult DeterminePositiveResponseType<T>(T response)
{
    Console.WriteLine(HttpMethod.Get.ToString());
    return HttpContext.Request.Method switch
    {
        HttpMethod.Get.ToString() => Ok(response),
        HttpMethod.Post.ToString() => Created("", response)
    };
}

Цель состоит в том, чтобы вернуть соответствующие ObjectResult в зависимости от того, какой тип запроса поступил к API.

HttpMethod.Get.ToString() должен просто возвращать строку "GET" и это происходит в рамках Console.WriteLine метода. Тот же фрагмент кода внутри оператора switch выдает ошибку:

Имя типа «Get» не существует в типе «HttpMethod»

pic rel

Я понятия не имею, почему это происходит, и буду очень признателен, если кто-нибудь сможет мне это объяснить. Спасибо.

Ответы [ 3 ]

4 голосов
/ 16 января 2020

Вы можете использовать сделать так:

        private ObjectResult DeterminePositiveResponseType<T>(T response)
    {
        var methodType = HttpContext.Request.Method;

        switch (methodType)
        {
            case string m when HttpMethod.Get.ToString() == methodType:
                return Ok(response);
            case string m when HttpMethod.Post.ToString() == methodType:
                return Created("",response);
            default:
                return Ok(response);
        }
    }
1 голос
/ 16 января 2020

Вы можете добиться этого, используя новый синтаксис переключателя следующим образом:

private ObjectResult DeterminePositiveResponseType<T>(T response)
{
    Console.WriteLine(HttpMethod.Get.ToString());
    return HttpContext.Request.Method switch
    {
        string s when s == HttpMethod.Get.ToString() => Ok(response),
        string s when s == HttpMethod.Post.ToString() => Created("", response)
        _ => Ok(response), //this line to prevent throwing of SwitchExpressionException
    };
}
1 голос
/ 16 января 2020

case значения в операторе switch должны быть константами, это означает, что любой ToString() в case не будет работать, поскольку он будет выполняться во время выполнения. Вы должны определить свои значения явно:

 return HttpContext.Request.HttpMethod switch
 {
     "GET" => Ok(response),
 }
...