Как методу возвращать разные типы?

Рейтинг: 1Ответов: 2Опубликовано: 14.02.2023

Хочу вынести CRUD операции из Program.cs в отдельный файл. При поиске юзера метод возвращает тип User, но если такой пользователь не найдется, то возвращается сообщение об ошибке, но уже другого типа. Компилятор на это ругается.
Как добавить возможность возвращать разные типы для функции? Или как это еще можно обыграть по-другому?

app.MapGet("/user/{id}", (int id) =>
{
    return Results.Ok(TryToGetUserBy(id));
});


User TryToGetUserBy(int id)
{
    User? user = users.FirstOrDefault(user => user.Id == id);

    if (user == null) return Results.NotFound(new { message = "Пользователь с таким id не найден" });

    return user;
{

Ответы

▲ 4Принят

В данном случае лучше наоборот, сузить работу функции.

TryToGetUserBy должна возвращать только User, а сам ответ формироваться в MapGet

Например так:

app.MapGet("/user/{id}", (int id) =>
{
    return TryToGetUserBy(id) is {} user ? Results.Ok(user) : Results.NotFound(new { message = "Пользователь с таким id не найден" });
});


User TryToGetUserBy(int id)
{
    return users.FirstOrDefault(user => user.Id == id);
}
▲ 2

Добавьте в проект ApiController и в него метод:

[HttpGet]
public ActionResult<User> GetUser(int UserId)
{
    var foundUser = users.FirstOrDefault(user => user.Id == UserId);
    return foundUser == null ? NotFound() : foundUser;
}

В этом случае результат будет с кодом состояния HTTP - 200 или 404.
Подробнее про типы возвращаемых значений действий контроллера в веб-API ASP.NET Core.